【问题标题】:c++ multiple definitions of a variablec++一个变量的多个定义
【发布时间】:2012-06-19 19:07:32
【问题描述】:

我有 4 个文件(2 个标头和 2 个代码文件)。 FileA.cpp、FileA.h、FileB.cpp、FileB.h

文件A.cpp:

#include "FileA.h"

int main()
{
    hello();
    return 0;
}

void hello()
{
    //code here
}

文件A.h:

#ifndef FILEA_H_
#define FILEA_H_
#include "FileB.h"
void hello();

#endif /* FILEA_H_ */

文件B.cpp:

#include "FileB.h"

void world()
{
    //more code;
}

文件B.h:

#ifndef FILEB_H_
#define FILEB_H_

int wat;
void world();


#endif /* FILEB_H_ */

当我尝试编译(使用 eclipse)时,我得到“'wat' 的多重定义” 而且我不知道为什么,它似乎应该可以正常工作。

【问题讨论】:

    标签: c++ compiler-errors


    【解决方案1】:

    我不打算包含所有细节,但是您在编译 uint 中定义了一个全局变量 wat 两次。

    要修复,请使用以下内容:

    文件B.h

    extern int wat;
    

    文件B.cpp

    int wat = 0;
    

    这个 (extern) 告诉编译器变量 wat 存在某处,并且它需要自己找到它(在这种情况下,它在 FileB.cpp 中)

    【讨论】:

    • 它会影响const 变量的优化吗?编译器优化是在编译阶段还是在链接阶段运行?
    【解决方案2】:

    不要在标头中声明变量。 #include 从字面上复制文件的内容并将其粘贴到另一个文件中(也就是说,任何执行 #include "FileB.h" 的文件都会将 FileB.h 的内容复制到其中,这意味着 int wat 在每个文件中定义#include "FileB.h").

    如果你想从 FileA.cpp 访问wat,并且它在 FileB.cpp 中声明,你可以在 FileA.cpp 中将其标记为extern

    【讨论】:

      【解决方案3】:

      我现在找到了答案(我想一个接一个地查看文件会有所帮助) 问题是编译器创建了一个 FileB.o,它的定义是 wat, 然后它尝试用 FileA.cpp 编译 FilB.o,而 FileA.h 包含 FileB.h,它现在也有 wat 的定义。

      【讨论】:

      • 我只有一个 blabla.h 文件,并带有包含保护 (#ifndef xxx_H ...) 和一个全局变量。在编译时,我得到了“myglobal_variable”错误的多重定义。
      【解决方案4】:

      您得到多个定义,因为wat 在文件范围内声明,并且 get 在 2 个源文件中可见两次。

      改为声明变量extern 并将其定义在一个源文件中。

      extern int wat;  // In FileB.h
      
      int wat;   // In FileB.cpp
      

      【讨论】:

        【解决方案5】:

        那个 wat 变量声明是一个应该属于 cpp 文件的定义。就好像您将函数体放入标题中一样。

        您需要将 extern 放在 wat 声明之前,并将不带 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
          • 1970-01-01
          相关资源
          最近更新 更多