在全局头文件中声明全局?

时间:2009-10-16 15:04:20

标签: c++

我有一个头文件,比如说Common.h,它包含在几个项目的所有文件中。基本上我想声明一个全局变量,例如:

class MemoryManager;
DLL_EXPORT MemoryManager* gMemoryManager;

当我这样做时,我发现很多链接器错误

类MemoryManager * gMemoryManager已经定义。

:(

3 个答案:

答案 0 :(得分:10)

因为它是在每个编译文件中创建变量的单独副本。然后这些在连接阶段发生碰撞。请记住,预处理器会读入所有头文件,并在所有头文件中生成一个大文件。因此,每次编译此大文件时,都会创建另一个gMemoryManager的相同副本。

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

在您的标头文件

extern DLL_EXPORT MemoryManager* gMemoryManager;

在您的一个C ++文件中

DLL_EXPORT MemoryManager * gMemoryManager;

顺便说一句,我不知道DLL_EXPORT是做什么的,我只是假设它需要进入两个地方。

答案 1 :(得分:2)

这个

MemoryManager* gMemoryManager;

定义变量。如果在标头中执行此操作,则将在包含该标头的每个转换单元中定义变量,从而导致链接器错误。如果您想声明变量,请按以下方式执行:

extern DLL_EXPORT MemoryManager* gMemoryManager;

并将定义放入一个cpp文件中。

答案 2 :(得分:0)

如果要在C ++中的多个源文件之间共享全局变量,则需要将它们仅在一个头文件(.h)中声明为

extern  typeName variableName;

并且只有相应的源文件(.cpp)应该包含定义

typeName variableName;

extern 关键字是区分声明与定义的必要条件。