extern
表示該實體具有外部鏈接,即在其翻譯單元(C或CPP文件)之外是可見的。這意味着相應的符號將被放置在目標文件中,因此如果該目標文件是靜態庫的一部分,它也將可見。但是,extern
本身並不意味着一旦目標文件成爲DLL的一部分,該符號也將可見。
__declspec(dllexport)
表示符號應該從DLL中導出(如果它確實是DLL的一部分)。編譯進入DLL的代碼時使用它。
__declspec(dllimport)
表示符號將從DLL導入。編譯使用DLL的代碼時使用它。
因爲相同的頭文件,通常使用兩個編譯DLL本身以及將使用該DLL的客戶端代碼時,它通常定義編譯DLL和__declspec(dllimport)
當編譯時解析爲__declspec(dllexport)
宏其客戶端,就像這樣:
#if COMPILING_THE_DLL
#define DLLEXTERN __declspec(dllexport)
#else
#define DLLEXTERN __declspec(dllimport)
#endif
爲了回答您的具體問題:
- 是,
extern
本身就足以爲靜態庫。
- 是的 - 此聲明還需要
extern
(see explanation here)。
- 不完全 - 參見上文。
- 您並不需要
extern
和__declspec(dllimport)
(請參閱上面的解釋),但由於您通常會使用相同的頭文件,因此在編譯時需要使用extern
DLL。
廣告4:什麼是虛擬內聯方法? AFAIK他們需要'extern';這實際上是我在http://stackoverflow.com/questions/2284648/dll-and-fully-specialized-template-class – liori 2010-02-20 18:23:48
中找到的對於類來說,最易於管理(並且通常)的方法是聲明整個類'__declspec (DLLEXPORT)'。導出單個類成員比較複雜......請參閱http://msdn.microsoft.com/en-us/library/81h27t8c%28VS.80%29.aspx。 – 2010-02-22 20:28:02