3

我已经冒险并正在学习 C。这是一个非常好的但易于管理的学习曲线,来自脚本(php,perl)背景,只有一点点 C#。

我已经使用了网站“Learn C The Hard Way”并且到目前为止掌握得相当好(我认为)但我无法理解其中一个练习的这一部分:

http://c.learncodethehardway.org/book/ex19.html

他创建了四个源文件——object.h、object.c、ex19.h、ex19.c

但我不明白 object.c 文件是如何包含的。

main 函数位于 ex19.c 中,它有一行

#include "ex19.h"

文件 ex19.h 有一行

#include "object.h"

但是 object.h 没有提及包含 object.c。有趣的是 object.c 包含该行

#include "object.h"

是否存在某种隐含的包含,如果包含头文件,它将自动包含同名的 c 源代码?

4

3 回答 3

6

这是一个称为链接器的单独程序的工作。在 C 中,源文件需要访问其他 C 源文件的头文件,以便它们可以查看有关第一个文件可能想要使用的第二个 C 文件定义的函数、类型和变量的信息。然后每个 C 文件独立于其余文件进行编译。编译器的输出是一个目标文件

为了构建最终的程序,第二个称为链接器的程序进入并将所有目标文件组合在一起成为整个可执行文件。该程序的任务是获取所有不同 C 文件的实现并将它们相互交叉引用,以便每次一个 C 文件引用不同 C 文件中的函数或变量时,实际上可以对适当的对象进行引用.

这就是您不需要包含.c文件的原因。一旦一个源文件有一个头文件,它就对另一个文件有足够的了解,以便使用它为编译器提供的函数来验证它是否正确使用它们。然后链接器处理实际进行交叉引用的工作。您可以将编译器视为一个程序,它检查是否定义了函数,然后程序可以工作。然后,链接器实际上会检查以确保首先定义了这些函数,并在可执行文件中设置了适当的链接。

希望这可以帮助!

于 2013-02-08T04:36:57.137 回答
1

不包括 Object.c。

它被编译为它自己的单元,它包括 object.h

查看制作文件:

CFLAGS=-Wall -g

all: ex19

ex19: object.o

clean:
  rm -f ex19

ex19: object.o告诉您必须在构建 ex19 之前创建 object.o,并且默认情况下,这是从 make 文件中提取的,因为 object.c 存在。

所以这个make文件说

要构建所有你需要的 ex19,要获得 ex19,你需要 object.o,而要创建 object.o,makefile 会选择从 object.c 构建的 object.o

从您参考的页面:

make 看不到 object.o 文件中的任何内容,但它确实看到了 object.c 文件,并且它知道如何将 .c 转换为 .o,因此它会这样做。

于 2013-02-08T04:38:10.837 回答
0

整个逻辑在于生成文件和智能编译器。创建的最终二进制文件有一个名为 object.o 的目标文件,理想情况下,该文件将包含 object.h 文件中定义的所有函数定义。它是将 .h 文件中声明的函数与 .o 文件中可用的定义链接的链接器。

于 2013-02-08T04:58:01.127 回答