天天看點

C++ 中extern 的用法

        前段時間看了extern 的用法,今天試了一下出現了如下問題,我在一個頭檔案1中定義了全局常量,然後在頭檔案2中定義了同樣的全局變量,然後把兩個頭檔案包含在另外一個cpp裡面出現了了重新定義的錯誤,去掉頭檔案2中的全局定義,undeclared identifier 的錯誤。最後把2中的所有全局變量加上了extern,結果出現undeclared indentifier錯誤,後經過查找在頭檔案2中沒有包含頭檔案1,修改後程式正常。

         通過這個錯誤更深刻了解了extern的作用。

        在編譯階段,完成對源代碼的文法檢查;在連接配接階段,完成空間内容的指定,比如确定函數在可執行程式中的位置。 聲明是告訴編譯器該變量或函數是存在的,定義則是配置設定了空間。現代編譯器一般采用按檔案編譯的方式,是以在編譯時,各個檔案中定義的全局變量是互相透明的,也就是說,在編譯時,全局變量的可見域限制在檔案内部。但是到了連結階段,要将各個檔案的内容“合為一體”,是以,如果某些檔案中定義的全局變量名相同的話,在這個時候就會出現重複定義的錯誤。是以,各個檔案中定義的全局變量名不可相同。

         在連結階段,各個檔案的内容(實際是編譯産生的obj檔案)是被合并到一起的,因而,定義于某檔案内的全局變量,在連結完成後,它的可見範圍被擴大到了整個程式。這樣一來,一個檔案中定義的全局變量,可以在整個程式的任何地方被使用。但會出現undeclared identifier 的錯誤。這是因為,檔案中定義的全局變量的可見性擴充到整個程式是在連結完成之後,而在編譯階段,他們的可見性仍局限于各自的檔案。

         但是C++提供了一個檔案中定義的全局變量,在另外一個檔案中使用的方法,即借助于關鍵字extern。其使用如下: extern 類型 變量名。這樣就可以在另外一個檔案中使用該檔案中定義的全局變量。最後不要忘記了加上最初定義全局變量的頭檔案。

此外,可能遇到extern “C”的用法,如下:

  在C++環境下使用C函數的時候,常常會出現編譯器無法找到obj子產品中的C函數定義,進而導緻連結失敗的情況C++語言在編譯的時候為了解決函數的多态問題,會将函數名和參數聯合起來生成一個中間的函數名稱,而C語言則不會,是以會造成連結時找不到對應函數的情況,此時C函數就需要用extern “C”進行連結指定,這告訴編譯器,請保持我的名稱,不要給我生成用于連結的中間函數名。