extern關(guān)鍵字的用法

前段時(shí)間在蕭大的技術(shù)社區(qū)http://cocode.cc/上看到一個(gè)問題(http://cocode.cc/t/topic/4213)提問者是個(gè)初學(xué)者,問的是C語(yǔ)言中關(guān)于變量的外部鏈接的問題,其實(shí)就是extern關(guān)鍵字的用法,回答了一下小白的問題,同時(shí)在回答問題的過(guò)程中自己也學(xué)到了新的東西,便有了把這個(gè)答案分享出來(lái)的打算。
首先我們來(lái)看看extern的定義:


這是維基百科上的定義,extern修飾的關(guān)鍵字,具有文件外部鏈接,但是聲明extern變量時(shí),編譯器并不會(huì)給這個(gè)變量分配內(nèi)存,在另外的文件中定義這個(gè)文件時(shí)才會(huì)為其分配內(nèi)存,一旦聲明了extern關(guān)鍵字,對(duì)編譯器來(lái)意味著:

  • 這個(gè)變量聲明(即數(shù)據(jù)類型和變量名,但是編譯器并沒有分配內(nèi)存)
  • 這個(gè)變量的定義在其他文件中(在定義變量的文件中編譯器才會(huì)為其分配內(nèi)存)

這看上去很奇怪,但是仔細(xì)想一想,這和函數(shù)的前置聲明以及類的前置聲明有異曲同工之處,在我看來(lái)這是為了將聲明與實(shí)現(xiàn)分離,便于文件之間的數(shù)據(jù)共享。

下面來(lái)看看extern的用法:

extern主要是為了解決在幾個(gè)源文件共享同一個(gè)變量,在鏈接各個(gè)cpp文件時(shí)。當(dāng)一個(gè)cpp文件在編譯的過(guò)程中,若需要一個(gè)變量但是當(dāng)前的作用域沒有發(fā)現(xiàn)其定義,如果這個(gè)變量是extern修飾的,那么編譯器會(huì)知道其定義在其他文件中,在obj文件的鏈接過(guò)程中會(huì)得到該變量的值。


example.h
example1.cpp

![Uploading QQ截圖20160415194053_267714.jpg . . .]


main.cpp

如果我們僅僅在頭文件中聲明了extern變量而為初始化它,那么會(huì)出現(xiàn)” undefined reference to ‘global_x’ ”的錯(cuò)誤,在使用extern的關(guān)鍵字的時(shí)候要注意一下幾點(diǎn):

  • extern變量可以聲明多次,但是只能初始化一次,如下
  • extern變量的初始化需要在全局作用域中初始化,所以在局部作用域中不論是聲明并初始化,或者聲明與初始化分開都會(huì)導(dǎo)致編譯器報(bào)錯(cuò),如下:


  • 一旦聲明了extern變量,那么在程序鏈接的時(shí)候無(wú)論它初始化沒有,都會(huì)查找extern的定義,如下:

這以上是extern的一些用法,我寫代碼的時(shí)候很少用到extern關(guān)鍵字,值得注意一點(diǎn)的是C語(yǔ)言中的函數(shù)原型是本身都具有外部鏈接的屬性的,在C語(yǔ)言中extern關(guān)鍵字的存在改變了變量的鏈接屬性,用extern關(guān)鍵字修飾的變量其定義將在別處,編譯器的變量的解析將推遲到鏈接上,在實(shí)際中,對(duì)于函數(shù)來(lái)說(shuō)extern將是沒有必要的修飾,而在對(duì)變量的修飾中,最好將extern變量的聲明放在頭文件中,將變量的定義放在一個(gè)源文件中。


相關(guān)資料:
extern的定義(Wiki需要科學(xué)上網(wǎng))

extern用法的例子(淺顯易懂)

關(guān)于如何正確上網(wǎng)使用extern(本文主要參考這個(gè)回答)

如何組織extern頭文件和源文件(答主寫的很用心,值得一看,我只看懂了一部分,捂臉。。。。)


Keep focus and have fun!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容