第一篇
一,static和extern:
大工程下我們會碰到很多原始檔。
檔案a.c
static
int i; //只在a檔案中用
int j; //在工程裡用
static
void init(
) //只在a檔案中用
void callme(
) //在工程中用
上面的全域性i變數和init()函式只能用在a.c檔案中,全域性變數sum的作用域只在callme裡。變數j和函式callme()的全侷限擴充到整個工程檔案。所以可以在下面的b.c中用extern關鍵字呼叫。extern告訴編譯器這個變數或者函式在其他檔案裡已經被定義了。
檔案b.c
extern
int j; //呼叫a檔案裡的
extern
void callme(
); //呼叫a檔案裡的
int main(
)extern的另外用法是當c和c++混合程式設計時如果c++呼叫的是c原始檔定義的函式或者變數,那麼要加extern來告訴編譯器用c方式命名函式:
檔案a.cpp呼叫a.c裡面的變數i和函式callme(
)extern
"c" //在c++檔案裡呼叫c檔案中的變數
int main(
) 二,static法則:
a、若全域性變數僅在單個c檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;
b、若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;
c、設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題;
第二篇c語言中extern的作用
extern可以置於變數或者函式前,以標示變數或者函式的定義在別的檔案中,提示編譯器遇到此變數和函式時在其他模組中尋找其定義。
在乙個原始檔裡定義了乙個陣列:
char a[6];
在另外乙個檔案裡用下列語句進行了宣告:
extern char *a;
請問,這樣可以嗎?
答案與分析:
1)、不可以,程式執行時會告訴你非法訪問。原因在於,指向型別t的指標並不等價於型別t的陣列。extern char *a宣告的是乙個指標變數而不是字元陣列,因此與實際的定義不同,從而造成執行時非法訪問。應該將宣告改為extern char a[ ]。
2)、例子分析如下,如果a = "abcd",則外部變數a=0x61626364 (abcd的ascii碼值),*a顯然沒有意義,如下圖:
顯然a指向的空間(0x61626364)沒有意義,易出現非法記憶體訪問。
3)、這提示我們,在使用extern時候要嚴格對應宣告時的格式,在實際程式設計中,這樣的錯誤屢見不鮮。
4)、extern用在變數宣告中常常有這樣乙個作用,你在*.c檔案中宣告了乙個全域性的變數,這個全域性的變數如果要被引用,就放在*.h中並用extern來宣告。
3 問題:extern 函式1
常常見extern放在函式的前面成為函式宣告的一部分,那麼,c語言的關鍵字extern在函式的宣告中起什麼作用?
答案與分析:
如果函式的宣告中帶有關鍵字extern,僅僅是暗示這個函式可能在別的原始檔裡定義,沒有其它作用。即下述兩個函式宣告沒有明顯的區別:
extern int f(); 和int f();
當然,這樣的用處還是有的,就是在程式中取代include 「*.h」來宣告函式,在一些複雜的專案中,我比較習慣在所有的函式宣告前新增extern修飾。
4 問題:extern 函式2
當函式提供方單方面修改函式原型時,如果使用方不知情繼續沿用原來的extern申明,這樣編譯時編譯器不會報錯。但是在執行過程中,因為少了或者多了輸入引數,往往會照成系統錯誤,這種情況應該如何解決?
答案與分析:
目前業界針對這種情況的處理沒有乙個很完美的方案,通常的做法是提供方在自己的***_pub.h中提供對外部介面的宣告,然後呼叫方include該標頭檔案,從而省去extern這一步。以避免這種錯誤。
寶劍有雙鋒,對extern的應用,不同的場合應該選擇不同的做法。
5 問題:extern 「c」
在c++環境下使用c函式的時候,常常會出現編譯器無法找到obj模組中的c函式定義,從而導致鏈結失敗的情況,應該如何解決這種情況呢?
答案與分析:
c++語言在編譯的時候為了解決函式的多型問題,會將函式名和引數聯合起來生成乙個中間的函式名稱,而c語言則不會,因此會造成鏈結時找不到對應函式的情況,此時c函式就需要用extern 「c」進行鏈結指定,這告訴編譯器,請保持我的名稱,不要給我生成用於鏈結的中間函式名。
下面是乙個標準的寫法:
//在.h檔案的頭上
#ifdef __cplusplus
#if __cplusplu*
**tern "c"
#endif
#endif
C語言中extern的用法
在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明 此變數 函式是在別處定義的,要在此處引用 1.extern修飾變數的宣告。舉例來說,如果檔案a.c需要引用b.c中變數int v,就可以在a.c中宣告extern int v,然後就可以引用變數v。這裡需要注意的是,被引用的變數v的鏈...
c語言中的extern用法
test.c include int number 1 int getnum int num int getnum2 int num main.c include extern int getnum int num extern int getnum2 int num extern int numb...
C語言中extern的用法
在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明 此變數 函式是在別處定義的,要在此處引用 1.extern修飾變數的宣告。舉例來說,如果檔案a.c需要引用b.c中變數int v,就可以在a.c中宣告extern int v,然後就可以引用變數v。能夠被其他模組以extern修飾符引...