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

时间:2016-12-15 19:08:30

标签: c++ class compilation linker header-files

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

1 个答案:

答案 0 :(得分:4)

  

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

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

如果你有一个包含函数和类的所有声明的头文件,它必须是#included来自任何使用它的翻译单元(.cpp文件)。
(声明合同的)步骤由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