这是由于头文件重定义造成的。
我当时的文件是这样的,然后就报了错
a.h
包含a class 的内容
a.cpp
#include "a.h"
b.h
#include "a.h"
b.cpp
#include "b.h""
main 函数
#include "a.h"
#include "b.h""
主要原因
C++语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。.cpp文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。
比如,在文件a.cpp中定义了一个全局函数“voida(){}”,而在文件b.cpp中需要调用这个函数。即使这样,文件a.cpp和文件b.cpp并不需要相互知道对方的存在,而是可以分别地对它们进行编译, 编译成目标文件之后再链接,整个程序就可以运行了。
因此编译器读取我的main函数时是这样的:
首先对宏定义 #include “a.h” 编译,然后对 #include “b.h” 编译,然而我的 b.h 中又
定义了 “a.h”。所以编译器又会对 “a.h” 编译。这样就会造成二次编译。
解决方案
- 当文件数太多,你不确定是否定义过了 a.h,那么可以用下面的方法解决。如果知道在哪里重复定义了,直接去掉宏定义即可
#ifndef _A_H_
#define _A_H_
......//头文件内容
#endif
比如我的是 "coordinate.h",我不确定有没有定义过这个文件。那么在main函数中,将其替换成下面代码即可
#ifndef _COORDINATE_H_
#define _COORDINATE_H_
#include "Line.h"
#endif
参考文献:
- https://www.cnblogs.com/Dyleaf/p/7898167.html
- https://www.so.com/link?m=bj468gaNHWVXG%2BCCmc1hEPcdO6WXxXmPIUOat614pX8KQ0wVxw7X9xKaiy93C4eTj4MtCwzqdQAlSCP1JvkGkQPinquS%2BQC3sY3TWhe0I1n1YHuBW3ST8RMil1fC%2FbTJf29pinJXQhctVE3Fx%2FP%2FyTV0%2FKHBeIbHgzvTvbSAuXNfiiVTAbY%2F9pBFkb93LJ4X2yvr%2F5JGUrxi2B2Lt%2BHu06z420cu3nBS4mQ35UoItXR9ssqMNf%2F0eiAVJBqJvA3E5UOK558lihzIyzJUm1wjScHIX4KE%3D