當前位置:學問君>學習教育>考研>

extern在函數聲明中的意思

學問君 人氣:5.33K

它可以用作一種格式上的提示表明函數的定義可能在另一個源檔案中, 但在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來聲明。