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

C++ 在全局头文件中声明全局文件?,c++,C++,我有一个头文件,比如Common.h,它包含在几个项目的所有文件中。基本上我想声明一个全局变量,例如: class MemoryManager; DLL_EXPORT MemoryManager* gMemoryManager; 当我这样做时,我会收到大量链接器错误,如 类MemoryManager*gMemoryManager已定义 :(?实际上,您正在每个编译文件中创建变量的单独副本。然后,这些副本在链接阶段发生冲突。请记住,预处理器读入所有头文件,并从所有头文件中生成一个大文件。因此,每

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

class MemoryManager;
DLL_EXPORT MemoryManager* gMemoryManager;
当我这样做时,我会收到大量链接器错误,如

类MemoryManager*gMemoryManager已定义


:(?

实际上,您正在每个编译文件中创建变量的单独副本。然后,这些副本在链接阶段发生冲突。请记住,预处理器读入所有头文件,并从所有头文件中生成一个大文件。因此,每次编译这个大文件时,都会创建另一个相同的
gMemoryManager
副本。

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

在头文件中

extern DLL_EXPORT MemoryManager* gMemoryManager;
<你的C++文件

DLL_EXPORT MemoryManager * gMemoryManager;
顺便说一句,我不知道DLL_导出的作用是什么,我只是假设它需要在这两个地方进行

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

extern DLL_EXPORT MemoryManager* gMemoryManager;

并将该定义完全放入一个CPP文件中。

< P>当您想在C++中的多个源文件中共享一个全局变量时,只需要将其声明为一个头文件(h)为

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

typeName variableName;

外部关键字需要区分声明和定义。< /P>这是一个MS特定扩展,与函数从库导出时的C++名称冲突有关。是否需要同时输入头文件和声明?我不想给出一些错误信息。谢谢。“RT”通常用于为Microsoft编译器定义“#u declspec(dllexport)”。#如果已定义(WIN32)#定义DLL_导出#u declspec(dllexport)#否则#定义DLL_导出#如果没有“#u declspec(dllexport)”,编译器将不会使该变量在DLL中可见。在头文件外不需要该变量。

typeName variableName;