【问题标题】:Multi Including a .h File多包括一个 .h 文件
【发布时间】:2009-11-02 20:41:37
【问题描述】:

在 .h 文件中,我将全局变量声明为:

#pragma data_seg(".shared")
#ifndef DEF_VARX
#define DEF_VARX
int VARX=0;
#endif /*DEF_VARX*/
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")

但是,如果我将此文件包含在多个 cpp 文件中,当我尝试编译时,我会收到“错误 LNK2005:“int VARX”(?VARX@@3HA) 已在 Dll.obj 中定义”错误。如果我只包含在一个 cpp 文件中,则不会遇到问题。

#IFNDEF....检查是否足以防止这种情况发生?我错过了什么吗?

【问题讨论】:

  • 防止这种情况是不够的。当您#include 某些内容时,它与将该文件的全部内容复制到您的文件中相同。当您将其复制到每个 cpp 文件中时,您就是在告诉每个文件包含“int VARX=0;”因为 DEF_VARX 不会在每个文件中第一次定义。因此,它们中的每一个都将包含 VARX 的定义。 #ifndefs 防止 int VARX;虽然在同一个文件中被定义了两次。

标签: c++


【解决方案1】:

这种行为的原因是,你编译了这一行

int VARX=0;

到每个 .obj 文件中。这可以编译,但是在链接时符号变成多重定义,这是非法的。使用

extern int VARX;

在头文件中,并且

int VARX=0;

在一个(也是唯一一个)源文件中解决了这个问题。

【讨论】:

    【解决方案2】:

    我认为您应该在 .h 中转发声明变量,然后在 .cpp 的共享部分中定义它,例如:

    // in a header file
    #pragma once
    extern int VARX;
    
    // in a .cpp
    #pragma data_seg(".shared")
    int VARX=0;
    #pragma data_seg()
    #pragma comment(linker, "/SECTION:.shared,RWS")
    

    【讨论】:

      【解决方案3】:

      问题在于您阻止了给定翻译单元的文件的多次包含。 (对于给定的说 cpp 文件)

      但如果您的多个 cpp 包含此 VARX.H,那么您将对该变量有多个定义。

      相反,您应该只在 .H 文件中声明变量,但只在一个位置将其初始化为 0。

      【讨论】:

        【解决方案4】:

        是的,您缺少 extern 关键字。

        在你的头文件中,使用:

        extern int VARX;

        在源文件中,实际为变量声明空间:

        int VARX = 0;

        【讨论】:

          【解决方案5】:

          ifdef 阻止它用于单独的目标文件。当标头包含在多个源 (cpp) 文件中时,VARX 将在所有源文件中定义。考虑在头文件中声明为extern,并在一个cpp文件中初始化。

          【讨论】:

            【解决方案6】:

            问题是您必须将文件包含在多个编译单元中。假设您有 a.cpp 和 b.cpp。两者都包含您的头文件。因此编译器将分别编译(和预处理),因此对于这两个文件,尚未定义 DEF_VARX。当您将目标文件链接在一起时,链接器会注意到存在名称冲突。

            正如其他人所建议的,解决方案是将其声明为“extern”,然后将实际值放入 cpp 文件中,因此它只编译一次,并链接到所有内容而不会发生名称冲突。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-21
              相关资源
              最近更新 更多