2012-09-09 145 views
3

我有一個頭文件global.h其中我聲明瞭一些我打算在其他文件中使用的變量。C++全局變量

#ifndef GLOBAL_H_ 
#define GLOBAL_H_ 

#include <stdio.h> 

typedef struct tag_KG_Data 
{ 
    int nKGStationID; 
    int nKGComPort; 

}GLOBAL_VAR; 

GLOBAL_VAR g_GlobalVar; 

BOOL b_newDataReady; 
BOOL b_startedSocketClient; 



#endif 

起初我只聲明GLOBAL_VAR g_GlobalVar文件test1.cppextern GLOBAL_VAR g_GlobalVar;,並且工作得很好。然後我宣佈了2 BOOL s,並在test2.cpp中使用它們,但是我得到了error LNK2005: "struct tag_KG_Data g_GlobalVar" ([email protected]@[email protected]@A) already defined in test1.obj並且對於每個全局變量,我都得到了類似的錯誤。問題是我沒有在test2.cpp中使用GLOBAL_VAR g_GlobalVartest1.cpp中的任何BOOL

+2

所以你有一些工作,現在你已經改變了它,它不再起作用。那裏有一個**大**的線索。 –

+0

@PeteBecker我同意,但我想明白爲什麼不工作,不只是爲了解決問題。 – MRM

+0

+1 @PeteBecker。不能簡單得多。 – WhozCraig

回答

8

這是因爲你在定義了這個全局標題,而你應該只有聲明瞭他們。

在您的全局定義之前添加extern,並在單個cpp文件中創建一個定義。

在標題:

// Declarations 
extern GLOBAL_VAR g_GlobalVar; 
extern BOOL b_newDataReady; 
extern BOOL b_startedSocketClient; 

在CPP文件:

// Definitions 
GLOBAL_VAR g_GlobalVar; 
BOOL b_newDataReady; 
BOOL b_startedSocketClient; 
+1

很好的答案。還有一件事是變量是否在.cpp文件中使用並不重要。由於.h包含文件在每次包含.h文件時都會定義它們,因此會創建一個新的變量定義。所以,當你做一個具有全局變量的.h文件包含在其他.h文件中時,如果你有一個#def #ifdef警衛來防止多重包含,你也可以得到同樣的效果。 #include是一個預處理器指令,用於將文件的文本拖入另一個文件,並在文本級別而不是編譯代碼級別上工作。幾乎從不在.h文件中聲明變量。 –

+0

這解決了生成的錯誤。謝謝,答案也爲我清除了一個模糊的C++區域:) – MRM