C 中extern的使用

2021-06-16 05:39:02 字數 1304 閱讀 5408

來自:

1. 宣告外部實體

宣告外部全域性變數或物件,一般用於標頭檔案中,表示在其它編譯單元內定義的變數,鏈結時進行外部鏈結,如: 

1. 宣告外部實體

宣告外部全域性變數或物件,一般用於標頭檔案中,表示在其它編譯單元內定義的變數,鏈結時進行外部鏈結,如:

extern int ivalue;

此時的extern是必須的,省略了extern編譯器將視為定義而不是宣告,一般地在源**中定義變數並進行初始化,在標頭檔案中使用extern宣告變數。

類似地用於宣告外部全域性函式,表示該函式在其它編譯單元中定義,如:

extern void func( void );

此時的extern可以省略。

2. 宣告函式的編譯和鏈結方式

extern 後可以跟」c」或」c++」用於宣告全域性函式的編譯和鏈結方式,例如:

extern 「c」 void add( int a, int b);

extern 「c++」 void sum(int* ia, int leng);

void sum(int* ia, int leng);

其中的extern 「c++」可以省略,它是在c++中預設的鏈結方式,即後面兩種宣告方式是等效的。這種宣告有兩種含義:首先,宣告這些函式使用外部鏈結方式,其實現不在本編譯單元之內;另一種含義,則是告訴編譯器編譯方式,如extern 「c」則是告訴編譯器使用c語言的編譯方式編譯該函式。

c++支援函式過載,所以引數不同在編譯後生成的函式名也不同,如:

int max(int a, int b);

int max(float a, float b);

在編譯時生成的函式名可能分別為_max_int_int、_max_float_float,通過在函式名後加上引數型別來區分不同的函式,如果使用c語言方式,則生成的函式名中不包含引數資訊,只生成_max,所以無法實現過載,也就是說在extern 「c」中不能出現函式名過載,例如:

extern 「c」

非法,編譯器將報錯。而c++標準中並沒有定義extern 「c」與extern 「c++」的具體實現方式,不同編譯器生成的符號規則可能不同。

需要注意的是,如果函式宣告使用了extern 「c」,則函式定義必須使用c編譯器編譯,或者使用extern 「c」來修改函式的編譯方式,一般地將extern 「c」宣告的函式的定義所在的源程式副檔名使用.c即可,而c++**放在.cpp檔案中。如果將extern 「c」宣告的函式實現也放在.cpp中,則需要使用extern 「c」來宣告函式編譯方式,例如:

extern 「c」

}

VC中extern的使用

extern為外部連線符號 通常是在定義介面 全域性變數 的時候這樣使用的,這樣的乙個宣告寫在標頭檔案內,供其他檔案包含。這時候extern表示函式的實現部份不在檔案內部,在連線的時候統一由聯結器處理,編譯器通常會假定編譯時候找不到實現部份的函式為extern形式.當然,加了extern也可以在該檔...

c 中關於const和extern的使用

可以將乙個做了宣告的非const變數定義在乙個檔案中,可以在另乙個檔案中使用這個變數。file 1.cpp int a 定義了a變數 file 2.cpp extern int a 在檔案2中使用a a 進行操作如果a變成const的變數,那麼,要使用a時定義和初始化時必須要用extern進行修飾,...

C 中extern 的用法

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