C++ 多重定义错误

标签 c++

我不想创建一堵代码墙,所以如果您需要任何代码,请询问,我会发布。我收到多个定义错误,我不知道为什么。我相信错误的发生是因为我试图在一个头文件中声明一个变量(并在同一个头文件中为它创建一个对象)然后在 4 个不同的文件中使用它。对于每个文件我都使用头文件我得到了多重定义,我已经为您提供了关于为什么会发生这种情况的任何想法?
请询问是否需要更多信息来解决问题。

我在 Windows 7 上使用 Code::Blocks ide mingW 编译器和编程

编辑
谢谢大家的快速帮助,解决了我的问题 :D

最佳答案

不要在头文件中声明它(尽管从技术上讲,我的意思是不要在那里定义)。

在你的头文件中你应该有:

extern int variableIWantOneCopyOfOnly;

然后,在您要链接的单个 C 源文件中,放入:

int variableIWantOneCopyOfOnly;

前者会让您所有的源文件都知道该变量的存在,但不会为其分配空间。包含第二行的单个翻译单元为其分配空间,链接器将修复对它的所有引用。

include guards 不会帮助多个定义,因为它们只会停止包含在一个翻译单元中。

我的意思是,如果您有以下文件:

xyz.h:               xyz1.c:                   xyz2.c:
    #ifnef XYZ           #include "xyz.h"          #include "xyz.h"
        #define XYZ
        int a;
    #endif

然后你执行如下命令:

gcc xyz1.c xyz2.c

那么他们都将获得 a自己的拷贝,而不是共享拷贝,因为包含保护的范围是翻译单元,而不是创建的可执行文件链接器。

关于C++ 多重定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6422757/

相关文章:

c++ - Int& 到 const int -static 与 dynamic-

c++ - 如何将一个点附加到opencv c中的另一个点

c++ - 在 C++ 中拟合 2d 高斯函数太慢

c++ - cin 流位置

c++ - 防止直接访问 std::map 键

c++ - Vim:公共(public)关键字的对齐方式

c++ - 当 C 和 C++ 中严格要求内存释放时?

c++ - 组合 lambda 捕获时编译错误

c++ - Clang 定义了什么宏来宣布 C++11 模式(如果有)?

c++ - 需要字符表