2015-08-21 111 views
1

我創建了一個函數庫,我想從中創建一個DLL並創建一個導出庫。創建DLL不是問題。將頭文件編譯爲DLL

問題是,我不希望開發人員/用戶查看頭文件的內部,因爲代碼沒有優化,並且即使它有效,它的一些看起來也是一團糟。

有無論如何我可以在另一個DLL中包含頭文件的內容,以便頭文件將被隱藏或有辦法將頭文件編譯爲二進制文件?

Win32,visual studio 2010,'c/C++'。

+3

如何移動你的醜惡實現了頭文件和你的DLL。 – WhozCraig

+0

我同意WhozCraig。頭文件定義了允許C/C++應用程序在DLL中創建的函數。所以你必須給開發者頭文件。如果那裏有東西你不希望它們看到,並且它不影響它們使用DLL的能力,那麼將它從頭文件中取出,它可能不在那裏。 –

+0

呃,DLL是你編譯你的源代碼的二進制文件 –

回答

2

首先,從標題刪除代碼:只需要聲明的功能,並指定類(即沒有在那裏代碼):

//header 
void my_ignomous_function(int); 
class my_ignomous_class { 
public: 
    my_ignomous_class(); 
    ~my_ignomous_class(); 
    bool my_ignomous_member(my_ignomous_class &x); 
private: 
    // unfortunately, you have to give these details. 
}; 

如果這還不夠,你可以使用pimpl idiom:在你的類使用指向用於實現的對象的指針。優點是你可以在頭文件中聲明實現類而不用任何細節。細節僅在實施中需要。

//header 
class my_nice_class { 
public: 
    my_nice_class() 
    ~my_nice_class() 
    bool my_nice_member(my_nice_class &x); 
private: 
    class my_horrible_secret_class *impl; 
}; 

的另一種方法是fune調整您的設計,讓你已經不再隱瞞什麼;-)

+0

是的,這很可怕,謝謝! –

+1

額外的道具,如果我可以投票兩次來演示pImpl,但我會彈出pimpl(snerk)到unique_ptr中,以獲得您從三規則規則中獲得的額外溫暖和模糊的感覺。 – user4581301

+0

我建議不要從DLL中導出C++實現。遵守CRT所施加的限制已經很困難(請參閱[在DLL邊界傳遞CRT對象的潛在錯誤](https://msdn.microsoft.com/zh-cn/library/ms235460.aspx))。添加不可見的代碼路徑(例如通過傳遞freestore支持的容器引用或拋出異常對象)不會改善這種情況。 – IInspectable