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

4
例如,我有一个名为Foo的类。我创建了Foo.hFoo.cpp文件,然后在main.cpp文件中包含了Foo.h文件。当我编译代码时,机器是如何知道将类头文件和类cpp文件关联起来的呢?是通过文件名完成的吗?
我非常想了解这个编译和链接的过程。

4
这两个文件没有关联,也没有必要关联。编译器和链接器不会将包含的文件作为文件,因为在此之前,预处理步骤会将所有内容混合在一起。 - deviantfan
1
这个网站旨在回答与代码问题有关的具体问题。您正在寻找C教程。 - kabanus
它根本不关联文件名,只查找符号名称。 你的 main.o 文件将引用在 Foo.h 中声明的符号,这些符号在 Foo.cpp 中定义,因此将在链接时在 Foo.o 中找到。 - Useless
一些好的阅读材料:https://gcc.gnu.org/onlinedocs/gcc-3.0.2/cpp_2.html - NathanOliver
一旦预处理器包含头文件并完成后,编译器“正式”的不再知道它的存在。编译器只知道翻译单元。阅读有关翻译的不同阶段的参考资料也可能会有所帮助。 - Some programmer dude
1
我并不认为这个问题“过于宽泛”,至少我们应该有一个合适的重复问题! - πάντα ῥεῖ
1个回答

5
当我编译代码时,机器如何知道将类头文件和类cpp文件关联起来?是根据文件名吗?
不是的,编译器没有这种自动关联功能。
如果您有一个包含所有函数和类声明的头文件,则必须从使用它的任何转换单元(.cpp文件)中进行#included操作。该步骤(声明契约)由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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接