C++ 编译器(或链接器?)如何知道如何处理 cpp 和头类文件?

Rex*_*exi 4 c++ linker compilation class header-files

例如,我有一个类 Foo。我创建Foo.hFoo.cpp然后将其包含Foo.hmain.cpp文件中。当我编译代码时,机器怎么知道将类头文件和类cpp文件关联起来?它是由文件名完成的吗?
我真的很想了解这个编译和链接的过程。

πάν*_*ῥεῖ 5

当我编译代码时,机器如何知道将类头文件和类 cpp 文件关联起来?它是通过文件名来做的吗?

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

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


一个简单的例子:

文件

 class Foo {
 public:
      Foo(); // Constructor declaration
 };
Run Code Online (Sandbox Code Playgroud)

文件

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

 Foo::Foo() {} // Constructor definition
Run Code Online (Sandbox Code Playgroud)

主程序

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

 int main() {
      Foo foo; // <<<<< Use declarations
 }
Run Code Online (Sandbox Code Playgroud)

要最终指示您的链接器将所有这些文件拼接在一起,您必须参考从翻译单元生成的工件。取决于工具链,但对于例如 GCC,您可以使用一些编译器命令行,例如

 $ g++ main.cpp Foo.cpp -o myProg
Run Code Online (Sandbox Code Playgroud)