1.使用extern時要嚴格對應聲明的格式,定義的是數組類型,extern char a[];而不能是extern char *a;
2.如果要在*.c文件中引用另一個文件中的一個全局變量,那就應該放在*.h中用extern來聲明這個全局變量。
3.函數聲明和定義前面extern沒有實際的意義(除非不想在對應頭文件聲明——省略頭文件),如果該函數不想被調用可以添加static關鍵詞
4.根據編譯器不同,有些編譯器可以鏈接(extern)常量:const float pi = 3.14; extern const flaot pi;
5.extern 可以鏈接外部變量,當我們兩個文件同時引用同一個全局變量的時候,只在一個文件定義,編譯時會在未定義的文件報錯;在兩個文件都定義,編譯通過,鏈接時會包定義衝突的錯誤,解決辦法就是其中一個文件定義,另一個文件extern來告訴編譯器這個變量在其他文件定義過了,自個兒去找(^..^)。當然也可以通過頭文件的方式來實現,變量定義在頭文件,連個引用變量的.c文件均include有該頭文件。
6.extern "c",在C++的環境,想要兼容C,一般都是需要extern "C"。格式:
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
…
…
//.h文件結束的地方
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
原因是雖說C++兼容C,但是由於C++具有面向對象的特性,所以假設沒有加上extern "C",而C++語法支持函數重載的原因,C++編譯器函數編譯後會有類似_foo_int_float_..這樣帶有變量參數之類的名字(函數重載實現的原理),而C的編譯器則會生成_foo這樣的名稱,所以在鏈接函數引用的時候會報錯(編譯後生成的名稱都不一樣如何引用C模塊的函數).