- 相關推薦
extern在函數(shù)聲明中的意思
在C語言中,修飾符extern用在變量或者函數(shù)的聲明前,用來說明“此變量/函數(shù)是在別處定義的,要在此處引用”。以下是小編整理的extern在函數(shù)聲明中的意思,希望對大家有所幫助。
它可以用作一種格式上的提示表明函數(shù)的定義可能在另一個源文件中, 但在extern int f();和int f();之間并沒有實質的區(qū)別。
基本解釋:extern可以置于變量或者函數(shù)前,以標示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時在其他模塊中尋找其定義。此外extern也可用來進行鏈接指定。
也就是說extern有兩個作用,第一個,當它與"C"一起連用時,如: extern "C" void fun(int a, int b);則告訴編譯器在編譯fun這個函數(shù)名時按著C的規(guī)則去翻譯相應的函數(shù)名而不是C++的,C++的規(guī)則在翻譯這個函數(shù)名時會把fun這個名字變得面目全非,可能是fun@aBc_int_int#%$也可能是別的,這要看編譯器的"脾氣"了(不同的編譯器采用的方法不一樣),為什么這么做呢,因為 C++支持函數(shù)的重載啊,在這里不去過多的論述這個問題,如果你有興趣可以去網(wǎng)上搜索,相信你可以得到滿意的解釋!
第二,當extern不與"C"在一起修飾變量或函數(shù)時,如在頭文件中: extern int g_Int; 它的作用就是聲明函數(shù)或全局變量的作用范圍的關鍵字,其聲明的函數(shù)和變量可以在本模塊活其他模塊中使用,記住它是一個聲明不是定義!也就是說B模塊(編譯單元)要是引用模塊(編譯單元)A中定義的全局變量或函數(shù)時,它只要包含A模塊的頭文件即可,在編譯階段,模塊B雖然找不到該函數(shù)或變量,但它不會報錯,它會在連接時從模塊A生成的目標代碼中找到此函數(shù)。
問題:extern 變量
在一個源文件里定義了一個數(shù)組:char a[6];
在另外一個文件里用下列語句進行了聲明:extern char *a;
請問,這樣可以嗎?
答案與分析:
1)、不可以,程序運行時會告訴你非法訪問。原因在于,指向類型T的指針并不等價于類型T的數(shù)組。extern char *a聲明的是一個指針變量而不是字符數(shù)組,因此與實際的定義不同,從而造成運行時非法訪問。應該將聲明改為extern char a[ ]。
2)、例子分析如下,如果a[] = "abcd",則外部變量a=0x61626364 (abcd的ASCII碼值),*a顯然沒有意義
顯然a指向的空間(0x61626364)沒有意義,易出現(xiàn)非法內存訪問。
3)、這提示我們,在使用extern時候要嚴格對應聲明時的格式,在實際編程中,這樣的錯誤屢見不鮮。
4)、extern用在變量聲明中常常有這樣一個作用,你在*.c文件中聲明了一個全局的變量,這個全局的變量如果要被引用,就放在*.h中并用extern來聲明。
拓展資料
1、可以通過把原函數(shù)名與參數(shù)信息結合,產生一個獨特的內部名字,這種技術叫做名字修飾(Name Mangling)。名字修飾規(guī)則沒有一個標準,所以不同的編譯器的名字修飾規(guī)則也不一樣。
下面是一組函數(shù),其中f()函數(shù)重載了:
f(void)和f(int)是不同的函數(shù),除了函數(shù)名相同以外沒有任何關系。當生成obj目標文件時,為了區(qū)分它們,C++編譯器根據(jù)參數(shù)信息進行了名字修飾:
2、C語言中沒有名字修飾(Name Mangling),因為C語言不支持函數(shù)重載。但是如果C++中含有C代碼,在編譯時C++編譯器對C代碼的函數(shù)也會進行名字修飾,函數(shù)名變了以后,將導致在C運行庫中找不到對應函數(shù),發(fā)生鏈接錯誤。
為了防止C++編譯器對C代碼進行名字修飾,我們將C代碼用extern “C”進行鏈接指定,告訴編譯器,在生成中間文件時,不要對這部分代碼進行名字修飾,而是生成符合C規(guī)則的中間符號名。
添加了extern “C”鏈接指示后,上面的代碼就能夠正常運行了。
extern在c語言中是什么意思
1、舉例來說,如果文件a.c需要引用b.c中變量intv,就可以在a.c中聲明extern intv,然后就可以引用變量v。能夠被其他模塊以extern修飾符引用到的變量通常是全局變量。還有很重要的一點是,extern intv可以放在a.c中的任何地方,比如你可以在a.c中的函數(shù)fun定義的開頭處聲明extern intv,然后就可以引用到變量v了,只不過這樣只能在函數(shù)fun作用域中引用v罷了,這還是變量作用域的問題。
2、如果全局變量不在文件的開頭定義,有效的作用范圍將只限于其定義處到文件結束。如果在定義點之前的函數(shù)想引用該全局變量,則應該在引用之前用關鍵字 extern 對該變量作外部變量聲明,表示該變量是一個已經(jīng)定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。
3、extern的另外用法是當C和C++混合編程時假如c++調用的是c源文檔定義的函數(shù)或變量,那么要加extern來告訴編譯器用c方式命名函數(shù)?梢酝ㄟ^把原函數(shù)名與參數(shù)信息結合,產生一個獨特的內部名字,這種技術叫做名字修飾。名字修飾規(guī)則沒有一個標準,所以不同的編譯器的名字修飾規(guī)則也不一樣。
【extern在函數(shù)聲明中的意思】相關文章:
在C++ 程序中調用被C 編譯器編譯后的函數(shù),為什么要加extern "C11-21
筆試題(extern)10-15
JavaScript中Function函數(shù)11-15
對EXCEL中的函數(shù)的認識09-11
導數(shù)在函數(shù)中的應用09-14
Excel中if函數(shù)使用的方法08-11
Javascript中的isNaN函數(shù)使用11-19
解讀Rnd 函數(shù)中的asp11-12