關於C 的extern關鍵字

2022-02-03 13:43:20 字數 1384 閱讀 7447

一、extern關鍵字的作用檔案中定義的全域性變數的可見性擴充套件到整個程式是在鏈結完成之後,而在編譯階段,他們的可見性仍侷限於各自的檔案。

編譯器的目光不夠長遠,編譯器沒有能夠意識到,某個變數符號雖然不是本檔案定義的,但是它可能是在其它的檔案中定義的。

雖然編譯器不夠遠見,但是我們可以給它提示,幫助它來解決上面出現的問題。這就是extern的作用了。 extern的原理很簡單,就是告訴編譯器:「你現在編譯的檔案中,有乙個識別符號雖然沒有在本檔案或本檔案當前位置中定義,但是它是在別的檔案中或本檔案其它位置定義的全域性變數,你要放行!」

二、extern關鍵字的用法大多數情況下,變數宣告也是定義。通過在extern限定符關鍵字可以宣告變數而沒有定義它,但要記住在程式的後面其他部分定義該變數。

fun1()

extern int a;//宣告a為全域性變數,其將在後面定義

a=8;// 在這裡可以使用了

int a;//定義全域性變數

注:如果將」int a;」定義語句放在函式fun1前,則在fun1中就不必再宣告a為全域性變數,因為編譯器已經知道a為乙個已經定義了的全域性變數了。語句「extern int a;」只是宣告乙個變數而沒有定義它,如果在宣告時給該變數賦初值,即語句」extern int a=1;」,那麼該宣告就變成了乙個定義全域性變數語句。顯然,在fun1內不能使用該語句,否則編譯器會給出乙個「不能對帶有塊範圍的外部變數進行初始化」的錯誤提示。

全域性變數預設就是外部鏈結的,即其extern可省略

三、其它參考extern是c/c++語言中表明函式和全域性變數作用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。記住,下列語句:

extern int a;

僅僅是乙個變數的宣告,其並不是在定義變數a,並未為a分配記憶體空間。變數a在所有模組中作為一種全域性變數只能被定義一次,否則會出現連線錯誤。

通常,在模組的標頭檔案中對本模組提供給其它模組引用的函式和全域性變數以關鍵字extern宣告。例如,如果模組b欲引用該模組a中定義的全域性變數和函式時只需包含模組a的標頭檔案即可。這樣,模組b中呼叫模組a中的函式時,在編譯階段,模組b雖然找不到該函式,但是並不會報錯;它會在連線階段中從模組a編譯生成的目標**中找到此函式。與extern對應的關鍵字是static,被它修飾的全域性變數和函式只能在本模組中使用。

四、再補充

C 的extern關鍵字

extern是乙個宣告,不是乙個定義,a模組想應用b模組的乙個函式或者變數,a模組包含b模組的標頭檔案,並且在變數或者標頭檔案前,加 extern,雖然編譯的時候,找不到模組的定義,但是在連線的時候,會在b模組生成的 中,找到函式或者變數。1 外部用的時候,不能乙個定義陣列,乙個定義指標這種 2 變...

C 之關鍵字extern

最近看了許多關於extern關鍵字的文章,有一些心得體會,本篇博文綜合了許多文章的內容,不正確的地方還希望大家能夠給予指正!其中先指明乙個誤區 許多人認為標頭檔案只能包含宣告,這其實是不對的!一 首先,讓我們來了解宣告和定義的基本概念。1.1.宣告的概念 大概來講宣告主要是為了支援模組 編譯單元 c...

extern關鍵字講解

基本解釋 extern可以置於變數或者函式 前,以標示變數或者函式 的定義在別的檔案中,提示編譯器遇到此變數和函式 時在其他模組中尋找其定義。另外,extern也可用來進行鏈結指定。2 問題 extern 變數 在乙個原始檔裡定義了乙個陣列 char a 6 在另外乙個檔案裡用下列語句進行了宣告 e...