一.extern修飾變數和函式
在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明「此變數/函式是在別處定義的,要在此處引用」。extern宣告不是定義,即不分配儲存空間。
先來看一段**
/* basic_stdy.h */
#ifndef_basic_stdy_h_
#define_basic_stdy_h_
//extern int a; //在標頭檔案中宣告,必須加上extern,否則就是重定義
//void fun(); //不用加extern也可以
#endif
/* basic_stdy.cpp */
#include"basic_stdy.h"
#includeusing namespace std;
int a(2);
void fun()
也就是說,在乙個檔案中定義了變數和函式, 在其他檔案中要使用它們, 可以有兩種方式:
1.使用標頭檔案,然後宣告它們,然後其他檔案去包含標頭檔案
2.在其他檔案中直接extern
二.extern"c"作用
比如說你用c 開發了乙個dll 庫,為了能夠讓c ++語言也能夠呼叫你的dll 輸出(export) 的函式,你需要用extern 「c」 來強制編譯器不要修改你的函式名。
通常,在c 語言的標頭檔案中經常可以看到類似下面這種形式的**:
#ifdef __cplusplus
extern "c"
#endif
1.現在要寫乙個c語言的模組,供以後使用(以後的專案可能是c的也可能是c++的),原始檔事先編譯好,編譯成.so或.o都無所謂。標頭檔案中宣告函式時要用條件編譯包含起來,如下:
#ifdef __cpluscplus
extern "c"
#endif
也就是把所有函式宣告放在some code的位置。
2.如果這個模組已經存在了,可能是公司裡的前輩寫的,反正就是已經存在了,模組的.**件中沒有 extern 「c」 關鍵字,這個模組又不希望被改動的情況下,可以這樣,在你的c++檔案中,包含該模組的標頭檔案時加上extern 「c」, 如下:
extern "c"
3.上面例子中,如果僅僅使用模組中的1個函式,而不需要 include 整個模組時,可以不 include 標頭檔案,而單獨宣告該函式,像這樣:
extern "c"
第三點要注意:當單獨宣告函式時候, 就不能要標頭檔案,或者在標頭檔案中不能寫extern intthisistest(int a, int b);否則會有error c2732: 鏈結規範與「thisistest」的早期規範衝突,這個錯誤,
然後就可一使用模組中的這個thisistest函式了。
還有就是要注意在*.c檔案中不能寫成 extern 「c」 intthisistest(int x,int y);在c語言的標頭檔案中,對其外部函式只能指定為extern型別,c語言中不支援extern "c"宣告,在.c檔案中包含了extern "c"時會出現編譯語法錯誤。
extern"c"的使用要點
1.可以是單一語句
extern "c" double sqrt(double);
2.可以是復合語句,相當於復合語句中的宣告都加了extern"c"
extern "c"
3.可以包含標頭檔案,相當於標頭檔案中的宣告都加了extern"c"
extern"c"
4.不可以將extern"c"新增在函式內部
5.如果函式有多個宣告,可以都加extern"c",也可以只出現在第一次宣告中,後面的宣告會接受第乙個鏈結指示符的規則。
6.除extern"c",還有extern"fortran"等。
三.宣告和定義知識點
1.定義也是宣告,extern宣告不是定義,即不分配儲存空間。extern告訴編譯器變數在其他地方定義了。
//eg:
extern int i; //宣告,不是定義
int i; //宣告,也是定義
2.如果宣告有初始化式,就被當作定義,即使前面加了extern。只有當extern宣告位於函式外部時,才可以被初始化。
///eg:
extern double pi=3.1416; //定義
3.函式的宣告和定義區別比較簡單,帶有{}的就是定義,否則就是宣告。
//eg:
externdouble max(double d1, double d2); //宣告
doublemax(double d1, double d2){} //定義
4.除非有extern關鍵字,否則都是變數的定義。
//eg:
extern int i; //宣告
int i; //定義
注: basic_stdy.h 中有 char glob_str;
而 basic_stdy.cpp 有 char glob_str;
此時標頭檔案中就不是定義,預設為extern
程式設計風格:
1.不要把變數定義放入.**件,這樣容易導致重複定義錯誤。
2.盡量使用static關鍵字把變數定義限制於該原始檔作用域,除非變數被設計成全域性的。
3.可以在標頭檔案中宣告乙個變數,在用的時候包含這個標頭檔案就宣告了這個變數。
**:《c/c++中extern關鍵字詳解》
C C 中extern關鍵字用法詳解
extern用於在多個檔案中間中,定義乙個全域性變數或者函式。可以在其他檔案中使用 extern 來得到乙個已定義的變數或函式的引用。extern用於函式宣告時,和普通的函式宣告並沒有區別。即extern int foo 和int foo 是一樣的效果的。使用extern更多的是表示該函式在其他檔案...
C C 中extern關鍵字
extern關鍵字可置於變數或者函式前,以表示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數或函式時,在其它模組中尋找其定義。另外,extern也可用來進行鏈結指定。在介紹外部變數之前,先來看一下什麼是區域性變數。下面是乙個例子。include define maxline 1000 int ...
C C 中extern關鍵字
當extern與 c 一起連用時,如 extern c void fun int a,int b 這就告訴編譯器在編譯fun這個函式名時按著c的規則去翻譯相應的函式名而不是c 的,c 的規則在翻譯這個函式名時會把fun這個名字弄得面目全非,例如 fun abc isdnfsdf 不同編譯器採取的翻譯...