我有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_ */
当我尝试编译(使用eclipse)时,我得到了“wat'的多重定义” 我不知道为什么,似乎应该可以正常工作。
答案 0 :(得分:26)
我不打算包含所有细节,但您在编译uint中定义了两次全局变量wat
。
要修复,请使用以下内容:
<强> FileB.h 强>
extern int wat;
<强> FileB.cpp 强>
int wat = 0;
这个(extern
)告诉编译变量wat
存在某处,并且它需要在它上面找到它(在这种情况下) ,它在FileB.cpp
)
答案 1 :(得分:7)
不要在标头中声明变量。 #include
从字面上将文件的内容复制并粘贴到另一个文件中(即,#include "FileB.h"
的任何文件都会将FileB.h的内容直接复制到其中,这意味着int wat
在每个执行#include "FileB.h"
)的文件中定义。
如果要从FileA.cpp访问wat
,并在FileB.cpp中声明它,可以在FileA.cpp中将其标记为extern
。
答案 2 :(得分:2)
您获得了多个定义,因为wat
在文件范围内声明,并且在2个源文件中可见两次。
相反,请创建变量声明extern
并在完全一个源文件中定义它。
extern int wat; // In FileB.h
int wat; // In FileB.cpp
答案 3 :(得分:1)
我现在找到了答案(我猜一个接一个地查看文件) 问题是编译器创建了一个具有wat定义的FileB.o, 然后它尝试使用FileA.cpp编译FilB.o,而FileA.h包含FileB.h,它现在也有一个wat的定义。
答案 4 :(得分:-1)
该wat变量声明是一个属于cpp文件的定义。就像你将函数体放入标题一样。
你需要在wat声明之前放置extern并将你当前的声明复制到其中一个cpp文件中。