亚洲国产日韩欧美在线a乱码,国产精品路线1路线2路线,亚洲视频一区,精品国产自,www狠狠,国产情侣激情在线视频免费看,亚洲成年网站在线观看

extern在函數(shù)聲明中的意思

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

extern在函數(shù)聲明中的意思

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

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

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

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

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

  問題:extern 變量

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

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

  請(qǐng)問,這樣可以嗎?

  答案與分析:

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

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

  顯然a指向的空間(0x61626364)沒有意義,易出現(xiàn)非法內(nèi)存訪問。

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

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

  拓展資料

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

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

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

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

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

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

  extern在c語言中是什么意思

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

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

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

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

在C++ 程序中調(diào)用被C 編譯器編譯后的函數(shù),為什么要加extern "C11-21

筆試題(extern)10-15

JavaScript中Function函數(shù)11-15

對(duì)EXCEL中的函數(shù)的認(rèn)識(shí)09-11

導(dǎo)數(shù)在函數(shù)中的應(yīng)用09-14

Excel中if函數(shù)使用的方法08-11

Javascript中的isNaN函數(shù)使用11-19

JavaScript中exec函數(shù)用法11-20

解讀Rnd 函數(shù)中的asp11-12