【问题标题】:Declaring a global in a global header file?在全局头文件中声明全局?
【发布时间】:2009-10-16 15:04:19
【问题描述】:

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

class MemoryManager;
DLL_EXPORT MemoryManager* gMemoryManager;

当我这样做时,我会收到大量的链接器错误提示

class MemoryManager* gMemoryManager 已定义。

:(?

【问题讨论】:

    标签: c++


    【解决方案1】:

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

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

    在你的头文件中

    extern DLL_EXPORT MemoryManager* gMemoryManager;
    

    在您的一个 C++ 文件中

    DLL_EXPORT MemoryManager * gMemoryManager;
    

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

    【讨论】:

    • 这是一个 MS 特定的扩展,与从库中导出函数时的 C++ 名称修饰有关。
    • 是否需要同时进入头文件和声明?我不想提供一些错误的信息。谢谢。
    • 根据我的经验,宏 'DLL_EXPORT' 通常用于为 Microsoft 编译器定义 '__declspec(dllexport)'。 #if defined(WIN32) #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT #endif 如果没有 '__declspec(dllexport)',编译器将不会使变量在 dll 中可见。头文件外不需要它。
    【解决方案2】:

    这个

    MemoryManager* gMemoryManager;
    

    定义一个变量。如果您在标头中执行此操作,则该变量将在包含该标头的每个翻译单元中定义,因此会出现链接器错误。如果你想声明一个变量,这样做:

    extern DLL_EXPORT MemoryManager* gMemoryManager;
    

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

    【讨论】:

      【解决方案3】:

      当你想在 C++ 中的多个源文件之间共享一个全局变量时,你只需要在一个头文件 (.h) 中声明它们为

      extern  typeName variableName;
      

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

      typeName variableName;
      

      extern 关键字用于区分声明和定义。

      【讨论】:

        猜你喜欢
        • 2016-06-27
        • 2012-04-05
        • 1970-01-01
        • 2019-04-15
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多