【发布时间】:2009-10-16 15:04:19
【问题描述】:
我有一个头文件,比如说 Common.h,它包含在多个项目的所有文件中。基本上我想声明一个全局变量,例如:
class MemoryManager;
DLL_EXPORT MemoryManager* gMemoryManager;
当我这样做时,我会收到大量的链接器错误提示
class MemoryManager* gMemoryManager 已定义。
:(?
【问题讨论】:
标签: c++
我有一个头文件,比如说 Common.h,它包含在多个项目的所有文件中。基本上我想声明一个全局变量,例如:
class MemoryManager;
DLL_EXPORT MemoryManager* gMemoryManager;
当我这样做时,我会收到大量的链接器错误提示
class MemoryManager* gMemoryManager 已定义。
:(?
【问题讨论】:
标签: c++
实际上,您正在每个编译文件中创建变量的单独副本。然后它们在链接阶段发生碰撞。请记住,预处理器会读取所有头文件并从所有头文件中生成一个大文件。因此,每次编译这个大文件时,都会创建另一个相同的 gMemoryManager 副本。
您需要使用extern并将其定义在一个非头文件中。
在你的头文件中
extern DLL_EXPORT MemoryManager* gMemoryManager;
在您的一个 C++ 文件中
DLL_EXPORT MemoryManager * gMemoryManager;
顺便说一句,我不知道 DLL_EXPORT 是做什么的,我只是假设它需要在两个地方都去。
【讨论】:
这个
MemoryManager* gMemoryManager;
定义一个变量。如果您在标头中执行此操作,则该变量将在包含该标头的每个翻译单元中定义,因此会出现链接器错误。如果你想声明一个变量,这样做:
extern DLL_EXPORT MemoryManager* gMemoryManager;
并将定义放入一个 cpp 文件中。
【讨论】:
当你想在 C++ 中的多个源文件之间共享一个全局变量时,你只需要在一个头文件 (.h) 中声明它们为
extern typeName variableName;
而且只有相应的源文件 (.cpp) 应该包含定义
typeName variableName;
extern 关键字用于区分声明和定义。
【讨论】: