extern使用方法總結

在c語言中,修飾符extern用在變量或者函數的聲明前,用來說明“此變量/函數是在別處定義的,要在此次引用”。

一、extern基本使用方法
1、函數
函數的聲明中使用extern關鍵字是可有可無的,因爲函數本身不加修飾的話就是extern的。(函數和全局變量本質上沒有區別,函數名時指向函數二進制塊開頭處的指針,而全局變量時在函數外部聲明的變量,函數名也是在函數外,因此函數也是全局的)
2、變量
全局變量在外部使用聲明時,必須要有extern關鍵字(如果變量無extern修飾且沒有顯式的初始化,則就變爲變量的定義編譯器在此標記存儲空間在執行時加載內存並初始化爲0)。
局部變量的聲明不能有extern修飾,且局部變量再運行時纔在堆棧部分分配內存空間。

二、頭文件
頭文件裏面存放的是關於函數、變量、類的聲明(不是定義,不要再頭文件裏面定義什麼東西)。

#ifndef _XXX_頭文件_.H
#define _XXX_頭文件_.H
...
int A;
#endif

這裏的int A是一個全局變量的定義,所以如果這個頭文件被多次引用的話,那麼A就會被重複定義,顯然語法上出現了錯誤。只不過有了#ifndef的條件編譯,所以能保證這個頭文件只被引用一次,不過也許還會有問題。若多個c文件包含這個頭文件時,因爲宏名有效範圍僅限於本c源文件,所以在這個多c文件編譯時是不會出錯的,但在鏈接時就會報錯,說你多處定義了同一個變量。所以在頭文件中最好不要定義變量等。

三、extern使用時最讓人迷惑的地方是讓人搞不清楚使用extern的地方是聲明還是定義。下面分別就變量和函數舉例說明。

(1)變量
<1> extern int a;     //聲明一個全局變量a
<2> int a;            //定義一個全局變量a
<3> extern int a = 0; // 定義一個全局變量a,並賦初值0
<4> int a = 0;        // 定義一個全局變量a,並賦初值0

(2)函數
函數定義的時候使用extern,說明這個函數是可以被外部引用的,聲明的時候用extern說這是一個聲明。但由於函數的定義和聲明有區別,定義韓式要有函數體,聲明函數沒有函數體,所以函數定義和聲明時都可以將extern省去,反正其它文件也是知道這個函數是在其他什麼地方定義的,所以不加extern也行。

四、總結:

1、對於變量而言,如果你想在本源文件中使用另一個源文件中定義的變量,就需要在使用前用extern聲明該變量,或者在頭文件中用extern聲明該變量;


2、對於函數而言,如果你想在本源文件中使用另一個源文件中定義的函數,就需要在使用前聲明給函數,聲明函數加不加extern都沒有關係,所以在頭文件中函數可以不用加extern。

3、extern用在變量聲明中常常有這樣一個作用,你在*.c文件中聲明瞭一個全局的變量,這個全局的變量如果要別引用,就放在*.h中並用extern來聲明。

4、如果函數的聲明中帶有關鍵字extern,僅僅說明這個函數可能在別的源文件裏定義,沒有其他作用,既如下兩個函數聲明沒有區別:
extern int f();和int f();

5、如果定義函數的c/cpp文件在對應的頭文件中聲明瞭定義的函數,那麼在其他c/cpp文件中要使用這些函數,就只需要包含這個頭文件即可。如果你不想包含頭文件,那麼就要在本c/cpp文件中聲明該函數。一般來說,聲明定義在本文件的函數不用extern,聲明定義在其他文件中的函數用extern,這樣在本文件中調用別的文件定義的函數時就不用包含頭文件。

使用extern和包含頭文件來引用函數有什麼區別呢?
extern的引用方式比包含頭文件喲啊簡潔的多。extern的使用方法是直接了當的,想引用哪個函數就用extern聲明哪個函數。這樣做有一個明顯的好處是,會加速程序的編譯(預處理)的過程,節省時間,在大型c程序的編譯過程中,這種差異很明顯。

6、此外,extern修飾符可以用於指示C或者C++函數的調用規範。比如C++中調用C庫函數,就需要在C++程序用extern "C"生聲明引用的函數。這是給連接器用的,告訴連接器在鏈接的時候用C函數規範來鏈接。主要是C++和C程序編譯完成後在目標代碼中命名規則不同。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章