一个variables的c ++多重定义
我有4个文件(2个头文件和2个代码文件)。 FileA.cpp,FileA.h,FileB.cpp,FileB.h
FileA.cpp:
#include "FileA.h" int main() { hello(); return 0; } void hello() { //code here }
FileA.h:
#ifndef FILEA_H_ #define FILEA_H_ #include "FileB.h" void hello(); #endif /* FILEA_H_ */
FileB.cpp:
#include "FileB.h" void world() { //more code; }
FileB.h:
#ifndef FILEB_H_ #define FILEB_H_ int wat; void world(); #endif /* FILEB_H_ */
当我尝试编译(与日食)时,我得到了“wat'的多重定义”而我不知道为什么,它似乎应该工作得很好。
我不打算包括所有的细节,但是你定义了一个全局variables,在你的编译uint中两次。
要修复,请使用以下内容:
FileB.h
extern int wat;
FileB.cpp
int wat = 0;
这个( extern
)告诉编译器,variableswat
存在于某个地方 ,并且它需要自己find它(在这种情况下,它在FileB.cpp
)
不要在头中声明variables。 #include
将文件的内容复制并粘贴到另一个文件中(即, #include "FileB.h"
任何文件将从字面上将FileB.h的内容复制到其中,这意味着在每个文件中定义int wat
包含#include "FileB.h"
)。
如果要从FileA.cpp访问wat
,并在FileB.cpp中声明,可以在FileA.cpp中将其标记为extern
。
你可以得到多个定义,因为wat
是在文件范围内声明的,在两个源文件中可以看到两次。
相反,将variables声明为extern
并将其定义在一个源文件中。
extern int wat; // In FileB.h int wat; // In FileB.cpp
我现在find了答案(我想看一个接一个的文件帮助)问题是,编译器创build一个FileB.o其中有一个定义的wat,然后它试图编译FilB.o与FileA.cpp,而FileA.h包含了FileB.h,现在它也会有一个wat的定义。
那个watvariables声明是一个应该属于cpp文件的定义。 就好像你将你的函数体放入头文件一样。
您需要在wat声明之前放置extern,并将当前声明(不带extern)复制到其中一个cpp文件中。