2010-02-18 78 views
18

「extern」和「__declspec(dllimport」)之間的區別/關係是什麼?我發現有時需要使用它們兩個,有時一個就足夠了。Windows&C++:extern&__declspec(dllimport)

我是正確的:

  1. 「外部」 是靜態鏈接庫,
  2. 「__declspec(dllimport的)」 是DLL(動態鏈接庫),
  3. 都這樣做實際上是相同的作爲他們各自的鏈接類型,
  4. 當你使用導入庫(幫助與dll鏈接的小型.lib文件)時,你需要同時使用它嗎?

回答

30

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 

爲了回答您的具體問題:

  1. 是,extern本身就足以爲靜態庫。
  2. 是的 - 此聲明還需要externsee explanation here)。
  3. 不完全 - 參見上文。
  4. 您並不需要extern__declspec(dllimport)(請參閱上面的解釋),但由於您通常會使用相同的頭文件,因此在編譯時需要使用extern DLL。
+0

廣告4:什麼是虛擬內聯方法? AFAIK他們需要'extern';這實際上是我在http://stackoverflow.com/questions/2284648/dll-and-fully-specialized-template-class – liori 2010-02-20 18:23:48

+1

中找到的對於類來說,最易於管理(並且通常)的方法是聲明整個類'__declspec (DLLEXPORT)'。導出單個類成員比較複雜......請參閱http://msdn.microsoft.com/en-us/library/81h27t8c%28VS.80%29.aspx。 – 2010-02-22 20:28:02