2009-11-02 107 views
0

在.h文件中,我聲明瞭一個全局變量爲:多,包括.h文件

#pragma data_seg(".shared") 
#ifndef DEF_VARX 
#define DEF_VARX 
int VARX=0; 
#endif /*DEF_VARX*/ 
#pragma data_seg() 
#pragma comment(linker, "/SECTION:.shared,RWS") 

但是如果我包括多個cpp文件這個文件,當我嘗試編譯,我得到「錯誤LNK2005:「int VARX」(?VARX @@ 3HA)已在Dll.obj中定義「錯誤。如果我只包含一個cpp文件,則不會遇到任何問題。

是不是#IFNDEF ....檢查足以防止這種情況?我想念什麼?

+1

這是不夠的,以防止這種情況。當你包括一些東西的時候,就像將該文件的全部內容複製到你的文件中一樣。當你將它複製到每個cpp文件中時,你都告訴它們每個都包含「int VARX = 0;」因爲DEF_VARX不會在每個文件中首次定義。所以他們每個人都會包含一個VARX的定義。 #ifndefs防止int VARX;從同一個文件中被定義兩次。 – pbos 2009-11-02 20:49:48

回答

2

我想你應該轉發在.H聲明變量,後來在一個.cpp其共享部分定義它,像:

// in a header file 
#pragma once 
extern int VARX; 

// in a .cpp 
#pragma data_seg(".shared") 
int VARX=0; 
#pragma data_seg() 
#pragma comment(linker, "/SECTION:.shared,RWS") 
1

的問題是,你阻止給定的翻譯單元包含多個文件。 (對於給定的cpp文件)

但是,如果您的幾個cpp包含此VARX.H,那麼您將有多個此變量的定義。

相反,您應該只聲​​明.H文件中的變量,但只在一個位置將其初始化爲0。

1

是的,你錯過了extern關鍵字。

在你的頭文件中,使用:

extern int VARX;

在源文件中,實際上對變量聲明空間:

INT VARx前提= 0;

0

ifdef阻止它作爲separe對象文件。當頭文件包含在幾個源文件(cpp)中時,VARX將被全部解包。考慮在頭文件中聲明它爲extern,並在一個cpp文件中進行初始化。

0

問題是您必須將文件包含在多個編譯單元中。假設你有a.cpp和b.cpp。兩者都包含您的頭文件。因此,編譯器將分別編譯(和預處理),因此對於這兩個文件,DEF_VARX尚未定義。當您將鏈接到目標文件時,鏈接程序會注意到存在名稱衝突。

正如其他人所說的,解決方案是聲明它爲'extern',然後將實際值放在一個cpp文件中,因此它只被編譯一次,並鏈接到沒有名稱衝突的所有內容。

3

這種現象的原因是,您編譯行

int VARX=0; 

到每個obj文件。這可以編譯,但在鏈接符號變得多次定義,這是非法的。使用

extern int VARX; 
在頭文件

,和

int VARX=0; 

在一個(並且只有一個)的源文件解決此問題。