基本解釋
extern可以置於變數或者函式
前,以標示變數或者函式
的定義在別的檔案中,提示編譯器遇到此變數和函式
時在其他模組中尋找其定義。
另外,extern也可用來進行鏈結指定。
2 問題: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 __cplusplus
extern "c"
#endif
#endif /* __cplusplus */
extern關鍵字總結
關於extern關鍵字總結 1.extern的變數的原先定義的地方不能有static修飾 2.如果宣告是const int,那麼extern也必須是extern const int 3.兩個.cpp檔案不能定義同乙個變數名 4.標頭檔案基本可以說是不能定義變數的,否則只要有多個cpp檔案包含了該標頭...
關鍵字 extern 使用
在c語言中,修飾符extern用在變數或者函式的宣告前,用來說明 此變數 函式是在別處定義的,要在此處引用 1.extern修飾變數的宣告。舉例來說,如果檔案a.c需要引用b.c中變數int v,就可以在a.c中宣告extern int v,然後就可以引用變數v。能夠被其他模組以extern修飾符引...
extern 關鍵字用法
overrides public virtual bool initinstance extern 摘自 extern lpdirectdraw4 lpdd 宣告lpdd,但是不分配記憶體,只說明他是你可以用的變數,在此程式之外其他的程式中已經聲名了他。其實他就是防止名字衝突 extern 申明本地...