標頭檔案中不能定義變數
阿新 • • 發佈:2018-11-28
標頭檔案中定義全域性變數會出現的問題
=====本文轉載的,在工作中,很受用,特此記錄之。======
直接在標頭檔案中定義全域性變數,然後有多個檔案包含這個標頭檔案時,編譯通過不了,提示重複定義變數!
在標頭檔案中定義全域性變數時前面加上關鍵字static,此時編譯會通過但是此時全域性變數的作用域不是我們想要的結果!
測試:
/* 再標頭檔案中定義一個全域性變數 */
static int a = 0;
/* 然後在兩個包含了此標頭檔案的C檔案中分別列印這個變數的地址 */
printf("&a = %x\n", (uint)&a);
測試結果你會發現 兩個地址不一樣 !!原因是它在每個原始檔中都有一份這個變數的拷貝,而不是共用一個變數。它的作用域只在一個原始檔中,而不是我們想要的跨檔案的全域性變數。
怎樣得到真正的全域性變數?
在其中一個原始檔中定義一個全域性變數
在其他原始檔中使用 extern 宣告此變數,就可以使用了
或者在 標頭檔案 中使用 extern 宣告此變數,然後在需要使用這個變數的原始檔中包含此標頭檔案
例如:
/* 在其中一個原始檔中定義一個全域性變數 */
int a = 0;
/* 在其他原始檔或者標頭檔案中使用 extern
宣告此變數 */
extern int a;
特別注意 結構體變數
在GCC編譯環境下,在標頭檔案中直接定義全域性結構體變數是可以的。編譯時不會報錯,而且它在所有包含這個標頭檔案的原始檔中共用一個變數。
而在windows中的VS編譯環境下,不能直接在標頭檔案中定義全域性結構體變數,會和普通變數一樣報錯,提示重複定義變數!
/* 在標頭檔案中定義一個全域性結構體變數 */
struct test{
int a;
char b;
};
struct test test_1;
注:這些結果都是我親自動手測試過的
所使用的GCC版本:gcc version 4.8.2
所使用的VS版本:VS2010
所以建議不要在標頭檔案中定義任何變數