實例程序如下:
// a.c
// 編譯指令:cl /c a.c ----> a.obj
int a;
// b.c
extern int a;
int main()
{
int b = a;
}
文件 b.c 編譯後生成 b.obj 文件 ,extern 關鍵字表明整型變量(int) e 來自於外部的 .obj 文件或者.lib文件,所以爲了正確得到該變量,在 a.obj 文件中必然有一些引用信息,可以在其他文件中正確得到 .obj 文件。
以上爲 b.obj 的彙編代碼注意其中的符號 _e ,在對象文件 b.obj 文件進行連接時就是要根據符號 _e進行查找和定位,從而得到e的值。
b.obj文件的彙編代碼:
其中產生了符號 _e 所以在連接時a.obj才能正確找到e的值。正確連接後,變量e被分配到數據段,使用b.obj文件中的值進行正確的賦值,此時,變量e就有了確切的地址,符號_e自然就沒有用了,所以連接(link a.obj b.obj)後生成的a.exe中就沒有了符號_e.
變量(e)的修飾名稱(_e),是與編譯器設置相關的(和語言相關的),倘若變量e聲明在a.c文件中,在某個.cpp文件中如若使用到e,則應該使用extern "C" int e來進行說明,這樣其生產的obj文件對e的名稱修飾就是_e,而不是C++語言的修飾規則。