C 中extern 的用法

2021-04-12 21:02:21 字數 1073 閱讀 4695

前段時間看了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」進行鏈結指定,這告訴編譯器,請保持我的名稱,不要給我生成用於鏈結的中間函式名。

C 中extern 的用法

前段時間看了extern 的用法,今天試了一下出現了如下問題,我在乙個標頭檔案1中定義了全域性常量,然後在標頭檔案2中定義了同樣的全域性變數,然後把兩個標頭檔案包含在另外乙個cpp裡面出現了了重新定義的錯誤,去掉頭檔案2中的全域性定義,undeclared identifier 的錯誤。最後把2中的...

C 中extern的用法

c 中extern 的用法1宣告外部實體 宣告外部全域性變數或物件,一般用於標頭檔案中,表示在其它編譯單元內定義的變數,鏈結時進行外部鏈結,如 extern int ivalue 此時的extern 是必須的,省略了 extern 編譯器將視為定義而不是宣告,一般地在源 中定義變數並進行初始化,在標...

C 中extern的用法

1.宣告外部實體 宣告外部全域性變數或物件,一般用於標頭檔案中,表示在其它編譯單元內定義的變數,鏈結時進行外部鏈結,如 extern int ivalue 此時的extern是必須的,省略了extern編譯器將視為定義而不是宣告,一般地在源 中定義變數並進行初始化,在標頭檔案中使用extern宣告變...