例如,我有一个Foo类。我创建了Foo.hFoo.cpp,然后在Foo.h文件中包括了main.cpp。当我编译代码时,机器如何知道将类头文件和类cpp文件相关联?它是由文件名完成的吗?
我真的很想了解编译和链接的过程。

最佳答案



不,编译器没有这种自动关联。

如果您有一个包含所有函数和类的声明的头文件,则该头文件必须是任何使用它的翻译单元的#included(.cpp文件)。
该步骤(声明契约(Contract))由c预处理器完成,其中每次出现的#include "MyDeclarations.hpp"都将其替换为翻译单元中MyDeclarations.hpp的完整文件内容。

一个简单的例子:

Foo.hpp

 class Foo {
 public:
      Foo(); // Constructor declaration
 };

Foo.cpp
 #include "Foo.hpp" // <<<< Include declarations

 Foo::Foo() {} // Constructor definition

main.cpp
 #include "Foo.hpp" // <<<< Include declarations

 int main() {
      Foo foo; // <<<<< Use declarations
 }

为了最终指示链接器将所有这些文件一起拼合,您必须引用从翻译单元产生的工件。取决于工具链,但例如GCC,您可以使用一些编译器命令行,例如
 $ g++ main.cpp Foo.cpp -o myProg

10-06 08:55
查看更多