C++多个定义错误
C++ Multiple defintions error
我不想创建代码墙,所以如果你需要任何代码,只要问一下,我就会发布。我有多个定义错误,我不知道为什么。我相信这个错误的发生是因为我试图在一个头文件中声明一个变量(以及在同一个头中为它创建一个对象),然后在4个不同的文件中使用它。对于我在中使用的每个文件,我都得到了多个定义,我给了你一些关于为什么会发生这种情况的想法
请询问是否需要更多信息来解决问题。
我正在使用Code::Blocks-ide mingW编译器并在Windows7上编程
编辑
感谢大家以极快的速度帮助您解决了我的问题:D
不要在头文件中声明它(尽管从技术上讲,我的意思是不要在那里定义)。
在你的头文件中,你应该有:
extern int variableIWantOneCopyOfOnly;
然后,在您将要链接的单个C源文件中,放入:
int variableIWantOneCopyOfOnly;
前者将让您的所有源文件知道变量的存在,但不为其分配空间。包含第二行的单个翻译单元将为其分配空间,链接器将修复对它的所有引用。
Include保护对多个定义没有帮助,因为它们只会在单个翻译单元中停止包含。
我的意思是,如果你有以下文件:
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
的自己的副本,而不是共享副本,因为include-guard的作用域是翻译单元,而不是链接器创建的可执行文件。
您在页眉中使用过include保护吗?一般来说,你想把你的标题结构成这样:
#ifndef _HEADER_FILE_H
#define _HEADER_FILE_H
// actual definitions
#endif
还有#pragma once
,但这不是标准配置。
"以及在同一标题中为其创建一个对象"
如果您在页眉中定义内容,然后尝试链接来自包括该页眉在内的多个翻译单元的对象,则会出现多个定义错误。
如果头被调用,比如x.h,那么创建一个包括头的x.cc(或x.c++、x.cpp或任何您通常做的事情)。将对象的定义移动到其中。编译它并将它与应用程序中的其他对象链接。
多重定义错误意味着您多次声明同一变量。关于你正在做的事情,这是因为你包含了4倍于同一个文件(所以你声明了4倍的变量。
添加预处理器
#ifndef _HEADERFILE_H
#define _HEADERFILE_H
// Your declarations
#endif
或者,如果你正在使用Visual studio,只需将其添加到文件的第一行:
#pragma once
您应该将实际定义移动到c++(.cc.cpp-whatever)文件中,并且只将声明保留在标头中。此外,您还需要在声明前面加上"extern"。
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 使用命名空间时出现多个定义错误
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 在运算符重载定义中使用成员函数(const错误)
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在C++中使用内联方法时出现未定义的符号错误
- 已定义函数时出现 G++ "未定义的引用"错误
- C++ G++ 编译器 - 错误:隐式声明的定义
- 链接 cmake 时出现未定义的引用错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 链接阶段出现多重定义错误
- 已经以性格错误定义了
- vim ctag导致了对乐趣的错误定义
- C++ 隐式声明的编译器错误定义
- 编译器错误-定义问题.C++