一个变量的 C++ 多个定义
c++ multiple definitions of a variable
我有 4 个文件(2 个标头和 2 个代码文件)。文件A.cpp, 文件A.h, 文件B.cpp, 文件B.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'的多重定义"我不知道为什么,它似乎应该可以正常工作。
我不打算包含所有细节,但您定义了一个全局变量,在编译 uint 中wat
两次。
若要修复,请使用以下命令:
文件B.h
extern int wat;
文件B.cpp
int wat = 0;
这(extern
)告诉编译变量wat
存在于某个地方,并且它需要自己找到它(在这种情况下,它是FileB.cpp
不要在标头中声明变量。 #include
从字面上复制并粘贴文件的内容到另一个文件中(也就是说,任何#include "FileB.h"
的文件都会将FileB.h的内容复制到其中,这意味着int wat
在每个文件中定义#include "FileB.h"
)。
如果要从 FileA.cpp 访问wat
,并且它在 FileB.cpp 中声明,则可以在 FileA.cpp 中将其标记为extern
。
找到了答案(我想一个接一个地查看文件会有所帮助)问题是编译器创建了一个 FileB.o,它有一个 wat 的定义,然后它尝试使用 FileA.cpp 编译 FilB.o,而 FileA.h 包含 FileB.h,它现在也将具有 wat 的定义。
你会得到多个定义,因为wat
是在文件范围内声明的,并且在 2 个源文件中可见两次。
相反,应使变量声明extern
,并在一个源文件中定义它。
extern int wat; // In FileB.h
int wat; // In FileB.cpp
wat 变量声明是应该属于 cpp 文件的定义。就好像您将函数体放入标头中一样。
您需要将 extern 放在 wat 声明之前,并将您当前的声明(没有 extern)复制到其中一个 cpp 文件中。
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何定义一个纯抽象基类