为什么包含.h也会使.cpp源出现呢?

Sch*_*ote 2 c++ linker compilation

我是一名经验丰富的程序员,但只有高级语言; 我正在用C++做我的第一个非常大的项目.

我有两节课,ClassA而且ClassB; a ClassA(除其他外)是索引ClassBs,因此ClassA需要知道ClassB从中构建数组是什么,并且ClassB需要知道什么ClassA是,所以当事情发生变化时它可以更新索引.这两个类都在他们自己的.h和.cpp文件中.

我认为从另一个中包含每个只会导致无限递归,所以我决定改为拥有#include "ClassA.cpp"并且#include "ClassB.cpp"在开始时main.cpp; 但这样做只会导致编译器警告这些文件中每个类和方法的多个定义.

经过一些实验,我发现包含ClassA.hClassB.h产生了所需的行为 - 但这没有任何意义,我只包括那些类的原型.当然,实际上使它们成立的代码永远不会混杂在一起?然而它确实如此.

这里发生了什么,我不明白?为什么包含ClassA.h也会使实际代码ClassA显示出来?为什么包括ClassA.cpp导致每个包含ClassA.h触发"多重定义"错误,即使它们在头部屏蔽或其他任何名称?

Bri*_*ian 6

缺少的步骤是链接器中的定义ClassA.cppClassB.cpp将不会被链接器看到,除非这些文件也在某些时候被编译.如果你做了这样的事情:

g++ main.cpp ClassA.cpp ClassB.cpp
Run Code Online (Sandbox Code Playgroud)

然后在定义的所有引用ClassA.cpp,并ClassB.cppmain.cpp将得到解决.但是,如果你这样做了

g++ main.cpp
Run Code Online (Sandbox Code Playgroud)

然后链接器根本不知道在哪里可以找到的定义,ClassA.cppClassB.cpp,你可能会得到一个错误.

如果你正在使用IDE,那么这个细节对你来说是隐藏的:IDE确保只要你将.cpp文件添加到你的"项目"中,它就会在你构建项目时被编译成最终的二进制文件.