C 變數宣告(extern用法總結)

2021-09-11 18:24:48 字數 1777 閱讀 5768

變數宣告向編譯器保證變數以給定的型別和名稱存在,這樣編譯器在不需要知道變數完整細節的情況下也能繼續進一步的編譯。變數宣告只在編譯時有它的意義,在程式連線時編譯器需要實際的變數宣告。

當使用多個檔案且只在其中乙個檔案中定義變數時(定義變數的檔案在程式連線時是可用的),變數宣告就顯得非常有用。您可以使用extern關鍵字在任何地方宣告乙個變數。雖然您可以在 c++ 程式中多次宣告乙個變數,但變數只能在某個檔案、函式或**塊中被定義一次。

定義包含了宣告,但是宣告不包含定義,如

int a = 0;     //定義並宣告了變數 a

extern int a; //只是宣告了有乙個變數 a 存在,具體 a 在哪定義的,需要編譯器編譯的時候去找。

函式也是類似,定義的時候同時宣告。但如果只是宣告,編譯器只知道有這麼個函式,具體函式怎麼定義的要編譯器去找。

void fun1(); //函式宣告

void fun1(){ //函式定義

cout<<"fun1"《在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明「此變數/函式是在別處定義的,要在此處引用」。

1. extern修飾變數的宣告。

如果檔案a.c需要引用b.c中變數int v,就可以在a.c中宣告extern int v,然後就可以引用變數v。

這裡需要注意的是,被引用的變數v的鏈結屬性必須是外鏈結(external)的,也就是說a.c要引用到v,不只是取決於在a.c中宣告extern int v,還取決於變數v本身是能夠被引用到的。

這涉及到c語言的另外乙個話題--變數的作用域。能夠被其他模組以extern修飾符引用到的變數通常是全域性變數

還有很重要的一點是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函式fun定義的開頭處宣告extern int v,然後就可以引用到變數v了,只不過這樣只能在函式fun作用域中引用v罷了,這還是變數作用域的問題。對於這一點來說,很多人使用的時候都心存顧慮。好像extern宣告只能用於檔案作用域似的。

2. extern修飾函式宣告。

從本質上來講,變數和函式沒有區別。函式名是指向函式二進位制塊開頭處的指標。

如果檔案a.c需要引用b.c中的函式,比如在b.c中原型是int fun(int mu),那麼就可以在a.c中宣告extern int fun(int mu),然後就能使用fun來做任何事情。

就像變數的宣告一樣,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的檔案作用域的範圍中。

對其他模組中函式的引用,最常用的方法是包含這些函式宣告的標頭檔案。使用extern和包含標頭檔案來引用函式有什麼區別呢?extern的引用方式比包含標頭檔案要簡潔得多!extern的使用方法是直接了當的,想引用哪個函式就用extern宣告哪個函式。

這樣做的乙個明顯的好處是,會加速程式的編譯(確切的說是預處理)的過程,節省時間。在大型c程式編譯過程中,這種差異是非常明顯的。

3. 此外,extern修飾符可用於指示c或者c++函式的呼叫規範。

比如在c++中呼叫c庫函式,就需要在c++程式中用extern 「c」宣告要引用的函式。

這是給鏈結器用的,告訴鏈結器在鏈結的時候用c函式規範來鏈結。主要原因是c++和c程式編譯完成後在目標**中命名規則不同。

c 變數宣告extern說明

當使用extern關鍵字修飾變數 未初始化 表示變數宣告。當在另乙個檔案中,為extern關鍵字修飾的變數賦值時,表示變數定義。宣告在標頭檔案裡面,定義的檔案裡面包含有該宣告的標頭檔案。header.件如下 ifndef header h define header h 定義global x變數 在...

C語言 extern宣告的總結

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

C 中的extern宣告變數詳解

extern宣告變數無外乎如下兩種 1 宣告全域性變數 2 宣告函式 今天我們只談extern,什麼const static之類等等與之相關或不相關的一律忽略,下面就分別對以上兩種情況一一講解 宣告和定義 既然提到extern宣告變數,那我們就必須搞清楚宣告和定義的區別。這裡我們將普通資料變數和函式...