1. 程式人生 > >標頭檔案中不能定義變數

標頭檔案中不能定義變數

標頭檔案中定義全域性變數會出現的問題

=====本文轉載的,在工作中,很受用,特此記錄之。======

直接在標頭檔案中定義全域性變數,然後有多個檔案包含這個標頭檔案時,編譯通過不了,提示重複定義變數

在標頭檔案中定義全域性變數時前面加上關鍵字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

所以建議不要在標頭檔案中定義任何變數

轉自

https://blog.csdn.net/u014436243/article/details/80564279