激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

extern在函數聲明中的意思

時(shí)間:2023-03-16 19:04:31 賽賽 筆試題目 我要投稿
  • 相關(guān)推薦

extern在函數聲明中的意思

  在C語(yǔ)言中,修飾符extern用在變量或者函數的聲明前,用來(lái)說(shuō)明“此變量/函數是在別處定義的,要在此處引用”。以下是小編整理的extern在函數聲明中的意思,希望對大家有所幫助。

  它可以用作一種格式上的提示表明函數的定義可能在另一個(gè)源文件中, 但在extern int f();和int f();之間并沒(méi)有實(shí)質(zhì)的區別。

  基本解釋?zhuān)?/strong>extern可以置于變量或者函數前,以標示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時(shí)在其他模塊中尋找其定義。此外extern也可用來(lái)進(jìn)行鏈接指定。

  也就是說(shuō)extern有兩個(gè)作用,第一個(gè),當它與"C"一起連用時(shí),如: extern "C" void fun(int a, int b);則告訴編譯器在編譯fun這個(gè)函數名時(shí)按著(zhù)C的規則去翻譯相應的函數名而不是C++的,C++的規則在翻譯這個(gè)函數名時(shí)會(huì )把fun這個(gè)名字變得面目全非,可能是fun@aBc_int_int#%$也可能是別的,這要看編譯器的"脾氣"了(不同的編譯器采用的方法不一樣),為什么這么做呢,因為 C++支持函數的重載啊,在這里不去過(guò)多的論述這個(gè)問(wèn)題,如果你有興趣可以去網(wǎng)上搜索,相信你可以得到滿(mǎn)意的解釋!

  第二,當extern不與"C"在一起修飾變量或函數時(shí),如在頭文件中: extern int g_Int; 它的作用就是聲明函數或全局變量的作用范圍的關(guān)鍵字,其聲明的函數和變量可以在本模塊活其他模塊中使用,記住它是一個(gè)聲明不是定義!也就是說(shuō)B模塊(編譯單元)要是引用模塊(編譯單元)A中定義的全局變量或函數時(shí),它只要包含A模塊的頭文件即可,在編譯階段,模塊B雖然找不到該函數或變量,但它不會(huì )報錯,它會(huì )在連接時(shí)從模塊A生成的目標代碼中找到此函數。

  問(wèn)題:extern 變量

  在一個(gè)源文件里定義了一個(gè)數組:char a[6];

  在另外一個(gè)文件里用下列語(yǔ)句進(jìn)行了聲明:extern char *a;

  請問(wèn),這樣可以嗎?

  答案與分析:

  1)、不可以,程序運行時(shí)會(huì )告訴你非法訪(fǎng)問(wèn)。原因在于,指向類(lèi)型T的指針并不等價(jià)于類(lèi)型T的數組。extern char *a聲明的是一個(gè)指針變量而不是字符數組,因此與實(shí)際的定義不同,從而造成運行時(shí)非法訪(fǎng)問(wèn)。應該將聲明改為extern char a[ ]。

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

  顯然a指向的空間(0x61626364)沒(méi)有意義,易出現非法內存訪(fǎng)問(wèn)。

  3)、這提示我們,在使用extern時(shí)候要嚴格對應聲明時(shí)的格式,在實(shí)際編程中,這樣的錯誤屢見(jiàn)不鮮。

  4)、extern用在變量聲明中常常有這樣一個(gè)作用,你在*.c文件中聲明了一個(gè)全局的變量,這個(gè)全局的變量如果要被引用,就放在*.h中并用extern來(lái)聲明。

  拓展資料

  1、可以通過(guò)把原函數名與參數信息結合,產(chǎn)生一個(gè)獨特的內部名字,這種技術(shù)叫做名字修飾(Name Mangling)。名字修飾規則沒(méi)有一個(gè)標準,所以不同的編譯器的名字修飾規則也不一樣。

  下面是一組函數,其中f()函數重載了:

  f(void)和f(int)是不同的函數,除了函數名相同以外沒(méi)有任何關(guān)系。當生成obj目標文件時(shí),為了區分它們,C++編譯器根據參數信息進(jìn)行了名字修飾:

  2、C語(yǔ)言中沒(méi)有名字修飾(Name Mangling),因為C語(yǔ)言不支持函數重載。但是如果C++中含有C代碼,在編譯時(shí)C++編譯器對C代碼的函數也會(huì )進(jìn)行名字修飾,函數名變了以后,將導致在C運行庫中找不到對應函數,發(fā)生鏈接錯誤。

  為了防止C++編譯器對C代碼進(jìn)行名字修飾,我們將C代碼用extern “C”進(jìn)行鏈接指定,告訴編譯器,在生成中間文件時(shí),不要對這部分代碼進(jìn)行名字修飾,而是生成符合C規則的中間符號名。

  添加了extern “C”鏈接指示后,上面的代碼就能夠正常運行了。

  extern在c語(yǔ)言中是什么意思

  1、舉例來(lái)說(shuō),如果文件a.c需要引用b.c中變量intv,就可以在a.c中聲明extern intv,然后就可以引用變量v。能夠被其他模塊以extern修飾符引用到的變量通常是全局變量。還有很重要的一點(diǎn)是,extern intv可以放在a.c中的任何地方,比如你可以在a.c中的函數fun定義的開(kāi)頭處聲明extern intv,然后就可以引用到變量v了,只不過(guò)這樣只能在函數fun作用域中引用v罷了,這還是變量作用域的問(wèn)題。

  2、如果全局變量不在文件的開(kāi)頭定義,有效的作用范圍將只限于其定義處到文件結束。如果在定義點(diǎn)之前的函數想引用該全局變量,則應該在引用之前用關(guān)鍵字 extern 對該變量作外部變量聲明,表示該變量是一個(gè)已經(jīng)定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。

  3、extern的另外用法是當C和C++混合編程時(shí)假如c++調用的是c源文檔定義的函數或變量,那么要加extern來(lái)告訴編譯器用c方式命名函數?梢酝ㄟ^(guò)把原函數名與參數信息結合,產(chǎn)生一個(gè)獨特的內部名字,這種技術(shù)叫做名字修飾。名字修飾規則沒(méi)有一個(gè)標準,所以不同的編譯器的名字修飾規則也不一樣。

【extern在函數聲明中的意思】相關(guān)文章:

在C++ 程序中調用被C 編譯器編譯后的函數,為什么要加extern "C11-21

筆試題(extern)10-15

JavaScript中Function函數11-15

對EXCEL中的函數的認識09-11

導數在函數中的應用09-14

Excel中if函數使用的方法08-11

Javascript中的isNaN函數使用11-19

JavaScript中exec函數用法11-20

解讀Rnd 函數中的asp11-12

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频