extern

轉載自:https://blog.csdn.net/u012333003/article/details/25824243

變量聲明和變量是有區別的。C++支持分離式編譯機制,即程序可以被分割成多個文件,編譯時每個文件都是單獨被編譯。這樣,如果程序有多個文件,則需要在文件中有共享代碼的方法。比如一個文件中要使用另一個文件中定義的變量,我們將如何調用?

  解決問題的辦法是實現變量的聲明與定義相分離,聲明變量使得名字爲本程序文件所知道,比如一個文件如想使用在另外一個文件中定義的變量,則必須包含對那個變量名字的聲明,以讓該文件知道這不是要創建一個新的變量實體,只是說明來自於它處。而定義變量則是創建一個與名字相關的實體。聲明與定義變量的相同點就是都規定了變量的類型和名字,不同的是,定義變量還會給變量申請存儲空間,還可能給變量賦予一個初始值。

  如果我們只是要聲明一個變量,無需定義,則在變量前加關鍵字extern即可,而且還不能顯式初始化變量,加extern關鍵字表明該變量已經在別的程序文件中定義,這裏只是說明在本程序文件中通過這種方式告之本程序要用到那個名字變量爲在別處定義的變量。

  1. extern int i;  //只是聲明i而非定義i  
  2. int j; //聲明而且還定義了j  
需要注意的是,任何一個顯式初始化的聲明都將成爲定義,而不管有沒有extern,extern語句一旦變量賦予了初始值就變成了定義。

  1. extern double pi=3.1415926;  //定義  
在函數內部,如果試圖初始化一個extern關鍵字標記的變量將是錯誤的,我們需要記住的是,如果想要在多個文件中使用同一個變量,得必須將變量的聲明和定義相分離,變量的定義出現且只能出現在其中一個文件當中,而其他用到該變量的文件則必須對其進行extern式的聲明,不可再重複定義。

------------------------------------------------------------------------

三、extern關鍵字——extern的用法之二指明變量的外部鏈接屬性

  上面已經討論了變量的聲明與定義的問題,已經把extern關鍵字帶出水面,extern關鍵字看起來更像static的反義詞,它將後面的變量名指明是外部鏈接的,比如const和typedef在默認情況下都是內部鏈接。還有是聲明一個變量是來自外部文件的,編譯器將該條語句當做聲明而不是定義。我們知道,聲明只是聲明,無需爲之分配空間。但是在某一處該變量必然是有它的定義的,正如上面所說,變量的聲明和定義只是分離了,但肯定是都有的。如果你沒加extern,編譯器會認爲你是在定義一個變量,而且相應爲它分配空間,這樣可能是引發衝突,因爲在別的程序文件中你可能已經定義了該變量,然而你在此又定義了該變量的話,即意味着有兩個全局作用域的變量,對於這種情況,我們必須得使用extern來說明是在跨文件訪問這個全局變量。

------------------------------------------------------------------------

四、總結

  總的一點來說,extern有兩個作用,一是由於const和typedef在默認情況下是內部鏈接(靜態鏈接)的,我們用extern去修飾可讓它變成外部鏈接,讓其他程序文件可見。

二是用extern修飾後的變量名可表示是一個變量聲明,且僅僅是聲明,它的定義和聲明不在一起,可能是在別的文件中已經定義了該變量,我們在本文件中使用extern聲明僅僅是告訴編譯器,我們有這麼個名字的變量要用到,它的定義來自於別的文件中。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章