我有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
编译中的UINT的两倍。
要修复,使用以下命令:
FileB.h
extern int wat;
FileB.cpp
int wat = 0;
这( extern
)告诉变量编译wat
某处存在,它需要找到它自己(在这种情况下,它在FileB.cpp
)
不要声明在头部的变量。 #include
字面复制和粘贴文件的内容到另一个文件(即,做任何文件#include "FileB.h"
将逐字FileB.h的内容复制到它,这意味着int wat
获取每一个定义,它的文件#include "FileB.h"
)。
如果您要访问wat
从FileA.cpp,并且它在FileB.cpp声明,你可以将其标记为extern
在FileA.cpp。
你得到多重定义,因为wat
是在文件范围内声明和2个源文件得到的可见两次。
取而代之的是,把这些变量declartion extern
和一个源文件中定义它。
extern int wat; // In FileB.h
int wat; // In FileB.cpp
现在我找到了答案(我猜看文件一个又一个帮助)的问题是,编译器创建一个FileB.o其中有笏的定义,然后它会尝试编译FilB.o与FileA.cpp,而FileA.h有包括FileB.h它现在也有笏的定义。
这笏变量声明的是,应在一段cpp的文件属于一个定义。 这是因为如果你把你的函数体到头部。
您需要笏声明之前把extern和没有的extern复制当前的声明到cpp文件之一。