extern在函式宣告中的意思

才智咖 人氣:5.13K

它可以用作一種格式上的提示表明函式的定義可能在另一個原始檔中, 但在extern int f();和int f();之間並沒有實質的區別。

extern在函式宣告中的意思

基本解釋:extern可以置於變數或者函式前,以標示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。此外extern也可用來進行連結指定。

也就是說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生成的目的碼中找到此函式。

問題:extern 變數

在一個原始檔裡定義了一個數組:char a[6];

在另外一個檔案裡用下列語句進行了宣告:extern char *a;

請問,這樣可以嗎?

答案與分析:

1)、不可以,程式執行時會告訴你非法訪問。原因在於,指向型別T的指標並不等價於型別T的陣列。extern char *a宣告的是一個指標變數而不是字元陣列,因此與實際的定義不同,從而造成執行時非法訪問。應該將宣告改為extern char a[ ]。

2)、例子分析如下,如果a[] = "abcd",則外部變數a=0x61626364 (abcd的ASCII碼值),*a顯然沒有意義

顯然a指向的空間(0x61626364)沒有意義,易出現非法記憶體訪問。

3)、這提示我們,在使用extern時候要嚴格對應宣告時的格式,在實際程式設計中,這樣的錯誤屢見不鮮。

4)、extern用在變數宣告中常常有這樣一個作用,你在*.c檔案中聲明瞭一個全域性的變數,這個全域性的變數如果要被引用,就放在*.h中並用extern來宣告。