C++ 支持分離式編譯機制,允許將聲明和定義分離開。 變量的聲明規定了變量的類型和名字, 即使一個名字為程序所知,一個文件如果想使用別處定義的名字則必須包含對那個名字的聲明。定義則負責創建與名字關聯的實體。
如果想聲明一個變量而不定義
extern int a; //聲明不定義
int a; //聲明定義
1
2
變量能且只能被定義一次, 但是可以被聲明多次。
多個文件共享const對象
默認情況下,一個const對象只在當前文件內有限,如果多個文件出現了同名const變量,就是在不同文件分別定義的變量。
//1.cpp 定義一個INF
extern const int INF = 0x3f3f3f3f;
//1.h
extern const int INF; //與1.cpp里面的是同一個
extern "C"是告訴C++編譯器以C Linkage方式編譯,也就是抑制C++的name mangling機制。例如:
void Test(void);
C++編譯器可能實際把它改名為vTest_v,C++的重載/namespace等機制就是這樣來的。而
extern "C" void Test(void)
則和C編譯器一樣為_Test。
主要用與在C++代碼中調用的C函數的聲明,或C++中編譯的函數要在C中調用。
也就是說extern有兩個作用,第一個,當它與"C"一起連用時,如: extern "C" void fun(int a, int b);則告訴編譯器在編譯fun這個函數名時按着C的規則去翻譯相應的函數名而不是C++的,C++的規則在翻譯這個函數名時會把fun這個名字變得面目全非,可能是fun@aBc_int_int#%$也可能是別的,這要看編譯器的"脾氣"了(不同的編譯器采用的方法不一樣),為什么這么做呢,因為C++支持函數的重載啊,在這里不去過多的論述這個問題,如果你有興趣可以去網上搜索,相信你可以得到滿意的解釋!
第二,當extern不與"C"在一起修飾變量或函數時,如在頭文件中: extern int g_Int; 它的作用就是聲明函數或全局變量的作用范圍的關鍵字,其聲明的函數和變量可以在本模塊活其他模塊中使用,記住它是一個聲明不是定義!也就是說B模塊(編譯單元)要是引用模塊(編譯單元)A中定義的全局變量或函數時,它只要包含A模塊的頭文件即可,在編譯階段,模塊B雖然找不到該函數或變量,但它不會報錯,它會在連接時從模塊A生成的目標代碼中找到此函數。