2009-11-02 102 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; 

在一个(并且只有一个)的源文件解决此问题。