(1)在c語言的標頭檔案中定義變數出現的問題
最好不要傻嘻嘻的在標頭檔案裡定義什麼東西。比如全域性變數:
/*xx標頭檔案*/
#ifndef
_xx_標頭檔案.h
#define
_xx_標頭檔案.h
int a;
#endif
那麼,很糟糕的是,這裡的int a
是個全域性變數的定義,所以如果這個標頭檔案被多次引用的話,你的a會被重複定義,顯然語法上錯了。只不過有了這個#ifndef的條件編譯,所以能保證你的標頭檔案只被引用一次,不過也許還是不會出岔子,但若多個c檔案包含這個標頭檔案時還是會出錯的,因為巨集名有效範圍僅限於本c原始檔,所以在這多個c檔案編譯時是不會出錯的,但在鏈結時就會報錯,說你多處定義了同乙個變數
錯誤警告:linking...
incl2.obj : error lnk2005: "int glb" (?glb@@3ha)
already defined in incl1.obj
debug/incl.exe : fatal error lnk1169: one
or more multiply defined symbols found
正確的作法是在c原始檔中定義乙個全域性變數。在標頭檔案中加入全域性變數的宣告
乙個主要用於定義全域性變數的c原始檔
int
g_a;
char
g_x;
用於宣告定義的全域性變數
extern
int
g_a;//使用extern在標頭檔案中宣告全域性變數
extern
char
g_x;
乙個用於測試的標頭檔案
#include
void
f()
(3)標頭檔案中只是變數或著函式的宣告,不是定義
對變數而言,如果你想在本原始檔中使用另乙個原始檔的變數,就需要在使用前用extern宣告該變數,或者在標頭檔案中用extern宣告該變數;
對函式而言,如果你想在本原始檔中使用另乙個原始檔的函式,就需要在使用前用宣告該變數,宣告函式加不加extern都沒關係,所以在標頭檔案中函式可以不用加extern。
為了在幾個原始檔中共享變數i,首先把變數i的定義放置在乙個原始檔中: int i; 如果需要對變數i初始化,那麼可以在這裡放初始值。在編譯這個檔案時,編譯器將會為變數i分配記憶體空間,而其他檔案將包含變數i的宣告: extern int i; 通過在每個檔案中宣告變數i,使得在這些檔案中可以訪問/或修改變數i。然而,由於關鍵字extern,使得編譯器不會在每次編譯其中某個檔案時為變數i分配額外的記憶體空間。當在檔案中共享變數時,會面臨和共享函式時相似的挑戰:確保變數的所有宣告和變數的定義一致。為了避免矛盾,通常把共享變數的宣告(extern int i;)放置在標頭檔案中。需要訪問特殊變數的原始檔可以稍後包含適當的標頭檔案。此外,含有變數定義的原始檔包含每乙個含有變數宣告的標頭檔案,這樣使編譯器可以檢查兩者是否匹配。
C語言中如何定義全域性變數
c c 2010 09 06 13 01 39 閱讀590 字型大小 大 中小訂閱 眾所周知,全域性變數在被定義後,系統會為全域性變數分配記憶體並且它還可以被其他模組通過c語言中extern關鍵字呼叫。這樣就必須在 xx.c 和xx.h 檔案中定義。這種重複的定義很容易導致錯誤。下面是只需用在標頭檔...
C語言中全域性變數的定義與呼叫
1.譚浩強 書中對 全域性變數 的定義 在函式內定義的變數是區域性變數,而在函式外定義的變數叫做外部變數,外部變數是全域性變數。全域性變數可以為本檔案中其他函式所共用它的有效範圍從定義變數的位置開始到本原始檔結束。建立全域性變數的作用是增加了函式間資料聯絡的渠道。2.譚浩強 書中對 全域性變數 的宣...
C語言中的全域性變數定義與使用
1.書中對 全域性變數 的定義 在函式內定義的變數是區域性變數,而在函式外定義的變數叫做外部變數,外部變數是全域性變數。全域性變數可以為本檔案中其他函式所共用它的有效範圍從定義變數的位置開始到本原始檔結束。建立全域性變數的作用是增加了函式間資料聯絡的渠道。2.譚浩強 書中對 全域性變數 的宣告 用e...