标题文件如何参考源文件C

How do header files reference source files c++?

本文关键字:参考 源文件 文件 何参考 标题      更新时间:2023-10-16

我是C 新手。我对Python有过以前的经验,但是C 是我的第二语言。目前,我正在学习如何使用标题和源文件来帮助组织和编译项目的时间。我了解引用标头文件的正确语法(#include" foo.h"(,但我不明白标题文件本身如何涉及main.cpp中的源文件(foo.cpp(。我在标题文件中没有看到foo.cpp的任何引用,也没有在main.cpp中看到任何参考。编译器如何使用#include知道与foo.cpp一起缝制foo.h?如果这个问题是多余的,则表示歉意。我已经尝试了一下。我找到了很多有关如何使用标头和源文件的信息,但没有很好地解释它们的实际工作方式。

它没有。

首先,仅仅是因为有一个foo.h,并不意味着有一个foo.cpp。

因此,您的真正问题是"编译器如何知道将main.cpp和foo.cpp放入同一可执行文件中?"基本上,因为您告诉他们。

这在不同的OS,编译器和构建系统上完全不同,但基本上,您要做两件事之一。

a(单独编译文件,然后将它们链接在一起:

 cl main.cpp
 cl foo.cpp
 link main.obj foo.obj

b(将它们编译在一起:

 cl main.cpp foo.cpp

(这实际上只是以上的快捷方式,编译器会自动执行单个步骤(

他们没有。

每个.c.cpp文件是产生OBJ文件(.o(的单个汇编单元。这就是编译器所做的。每个OBJ文件可能包含未解决的引用。例如,如果您的main.cpp使用foo.h中声明并在foo.cpp中实现的函数foo(),则foo.o将包含foo()的编译代码,并且main.o将包含main()的编译代码,其中包括对foo()的呼叫。但是,main.o不知道foo()实际在哪里,并且对foo.o不知道。

然后,链接器将OBJ文件链接在一起。这是解决OBJ中未解决的参考文献的时间。链接器将main.ofoo.o作为其输入,然后将连接的零件产生whatever.exe。如果函数无法解析(例如,您忘记在链接器调用中包含foo.o(或在多个OBJ文件中使用相同名称的函数,则链接器将产生错误。