天天看點

Pimpl慣用法在dll導出的問題

在建元件類的時候,習慣性的使用Pimpl(pointer to implementation, 指向實作的指針)慣用法。目的是降低耦合、資訊隐藏、接口與實作分離。至于很多資料裡提到的”降低編譯依賴、提高編譯速度”個人沒有清晰的感受,可能是項目規模的原因,這裡隻當一個可能提出。因為是指針的緣故,為了確定記憶體的釋放,使用了智能指針std::tr1::shared_ptr,這是C++标準庫提供的方法。建立一個接口類類似下面:

class CImpW;
class CINIFILE_API CCIniFileW 
{
	///
	具體接口内容,省略……
	///
private:
	std::tr1::shared_ptr<CImpW> m_pImp;
};
           

工程會生成一個dll檔案,但是IDE會發出一個警告:

Pimpl慣用法在dll導出的問題

這個警告是說有對象沒有導出,客戶調用類的時候可能出現錯誤。我了解的是調用CImpW類會出現錯誤,但是在這裡,我這麼寫的目的就是不給客戶調用的,是以這個警告在弄清楚之後就直接忽略了。

有一些人可能有強迫症,消除一切的warning。這裡有幾種方法:

  1. 降低編譯器的警告級别,或者直接不提出警告。個人不建議這做,因為我認為“編譯器遠比你更清楚代碼怎麼執行的,除非那是你自己寫的編譯器”。顯然,99.99%的人都是用的别人的東西,然後這個忽略就會自己坑自己了,被坑過的可以自己回憶下。
  2. 強制關掉特定警告。這個隻有在明确了警告含義,并且很清楚的知道忽略警告不會産生不良後果或者不良後果正是你所預期的。才建議這麼做。這個有點符合我的情況,是以在頭檔案中添加“#pragma warning(disable:4251)”
    Pimpl慣用法在dll導出的問題
  3. 導出編譯器讓你導出的所有對象。C++中這個STL智能指針對象嵌套了很多的類和對象,我感覺實在是太麻煩了就沒有做(實際上,試圖這麼做過,但是放棄了)。