2009-10-16 231 views
4

我有一个头文件,可以说Common.h,它包含在几个项目中的所有文件中。基本上我想,当我做这个,我得到吨链接错误的说法在全局头文件中声明一个全局变量?

类的MemoryManager * gMemoryManager已定义声明一个全局变量,例如:

class MemoryManager; 
DLL_EXPORT MemoryManager* gMemoryManager; 

:(?

回答

10

因为它是你在每个编译文件创建变量的单独副本。这些都是然后在连接阶段发生碰撞。记住,预处理器中的所有头文件读取,使一个大文件了所有的人的。所以每个这个大文件编译时间,创建的gMemoryManager另一个完全相同的副本。

您需要使用extern和一个非头文件中定义它。

在你头文件

extern DLL_EXPORT MemoryManager* gMemoryManager; 

在你的C++一个文件

DLL_EXPORT MemoryManager * gMemoryManager; 

通过我不知道DLL_EXPORT做什么的样子,我只是假设,它需要在这两个地方去。

+0

从函数库中导出函数时,这是MS特定的扩展,用于处理C++名称加密。 – 2009-10-16 15:14:48

+0

它是否需要在头文件和声明?我不想提供一些错误的信息。谢谢。 – 2009-10-16 15:16:48

+0

根据我的经验,宏'DLL_EXPORT'通常用于为Microsoft编译器定义'__declspec(dllexport)'。 的#if定义(WIN32) 的#define DLL_EXPORT __declspec(DLLEXPORT) 的#else 的#define DLL_EXPORT #ENDIF 如果没有 '__declspec(dllexport)的' 编译器不会使变量可见在DLL中。 它不在头文件之外。 – gnash117 2013-03-28 16:32:06

2

MemoryManager* gMemoryManager; 

限定的变量。如果您在标题中执行此操作,则将在包含该标题的每个翻译单元中定义该变量,因此会导致链接器错误。如果你想申报一个变量,这样来做:

extern DLL_EXPORT MemoryManager* gMemoryManager; 

,并且将定义为只有一个CPP文件。

0

当你想分享其中在C++中多个源文件中的全局变量,你只需要在一个头文件(.h)中作为

extern typeName variableName; 

也仅仅是相应的源文件(申报。 CPP)应包含定义

typeName variableName; 

的extern关键字是必需的,以区分定义的声明。