- 相關推薦
extern在函數聲明中的意思
在C語言中,修飾符extern用在變量或者函數的聲明前,用來說明“此變量/函數是在別處定義的,要在此處引用”。以下是小編整理的extern在函數聲明中的意思,希望對大家有所幫助。
它可以用作一種格式上的提示表明函數的定義可能在另一個源文件中, 但在extern int f();和int f();之間并沒有實質的區別。
基本解釋: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來聲明。
拓展資料
1、可以通過把原函數名與參數信息結合,產生一個獨特的內部名字,這種技術叫做名字修飾(Name Mangling)。名字修飾規則沒有一個標準,所以不同的編譯器的名字修飾規則也不一樣。
下面是一組函數,其中f()函數重載了:
f(void)和f(int)是不同的函數,除了函數名相同以外沒有任何關系。當生成obj目標文件時,為了區分它們,C++編譯器根據參數信息進行了名字修飾:
2、C語言中沒有名字修飾(Name Mangling),因為C語言不支持函數重載。但是如果C++中含有C代碼,在編譯時C++編譯器對C代碼的函數也會進行名字修飾,函數名變了以后,將導致在C運行庫中找不到對應函數,發生鏈接錯誤。
為了防止C++編譯器對C代碼進行名字修飾,我們將C代碼用extern “C”進行鏈接指定,告訴編譯器,在生成中間文件時,不要對這部分代碼進行名字修飾,而是生成符合C規則的中間符號名。
添加了extern “C”鏈接指示后,上面的代碼就能夠正常運行了。
extern在c語言中是什么意思
1、舉例來說,如果文件a.c需要引用b.c中變量intv,就可以在a.c中聲明extern intv,然后就可以引用變量v。能夠被其他模塊以extern修飾符引用到的變量通常是全局變量。還有很重要的一點是,extern intv可以放在a.c中的任何地方,比如你可以在a.c中的函數fun定義的開頭處聲明extern intv,然后就可以引用到變量v了,只不過這樣只能在函數fun作用域中引用v罷了,這還是變量作用域的問題。
2、如果全局變量不在文件的開頭定義,有效的作用范圍將只限于其定義處到文件結束。如果在定義點之前的函數想引用該全局變量,則應該在引用之前用關鍵字 extern 對該變量作外部變量聲明,表示該變量是一個已經定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。
3、extern的另外用法是當C和C++混合編程時假如c++調用的是c源文檔定義的函數或變量,那么要加extern來告訴編譯器用c方式命名函數。可以通過把原函數名與參數信息結合,產生一個獨特的內部名字,這種技術叫做名字修飾。名字修飾規則沒有一個標準,所以不同的編譯器的名字修飾規則也不一樣。
【extern在函數聲明中的意思】相關文章:
在C++ 程序中調用被C 編譯器編譯后的函數,為什么要加extern "C11-21
筆試題(extern)10-15
對EXCEL中的函數的認識09-11
導數在函數中的應用09-14
Excel中if函數使用的方法08-11
JavaScript中exec函數用法11-20
解讀Rnd 函數中的asp11-12