我有一个头文件,比如说Common.h,它包含在几个项目的所有文件中。基本上我想声明一个全局变量,例如:
class MemoryManager;
DLL_EXPORT MemoryManager* gMemoryManager;
当我这样做时,我发现很多链接器错误
类MemoryManager * gMemoryManager已经定义。
:(
答案 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 关键字是区分声明与定义的必要条件。