一个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文件中。