首页 > 解决方案 > 头文件中的函数如何链接到 .c 文件?

问题描述

在第4题中cs50,有一个main函数filter.c,它使用了头文件helper.h。后者包含了几个函数的原型,这些完整的函数写在helper.c

我的问题是:既然filter.c只连接到helper.h,它如何连接到函数的代码?或者 filter.c 是否也会自动查找与链接头文件同名的 .c 文件?

我希望这有点清楚!

标签: cheader-filescs50

解决方案


程序的编译C涉及下面简要列出的三个基本步骤:

预处理:

预处理器获取C源代码文件并处理#includes,#defines和其他预处理器directives。还清理所有注释并展开这些文件中的所有宏。(它对 c 和 h 文件都执行)此步骤的输出是一个"pure" C没有预处理器指令的文件。

汇编:

编译器获取预处理器的输出并从中生成一个目标文件。用适合您的代码将在其上运行的 cpu 的程序集编写。

链接:

链接器获取编译器生成的目标文件并生成库或可执行文件。其中包含由操作系统直接运行的所有信息和进程术语(.out 或 .elf 是链接器输出的示例)。

你的情况

在您所在filter.c的每个.c文件(包括helper.c)中或中#includes "helper.h",此步骤以helper.h复制中声明的所有函数签名结束filter.c仅签名)。现在这发生在preprocessor time. 现在在main.c哪里(我想)你#includes "filter.h",预处理器会将所有嵌套 .h文件(告诉到达.h链中的最后一个文件)复制到main.c(在我们的例子中它只filter.h包含helper.h)。在compiler编译文件时,.c他编译并生成目标文件( 或- 适合当前 cpu 的二进制文件),最后他触发链接器链接所有这些helper.c'filter.cmain.c.o.objobjects一起成为并完全可执行(链接器还链接来自预定义库的所有函数,例如 printf)

                 preprocessor                    compiler                 linker
                 ------------                    --------                 --------
+------------+ copy helper.h to    +----------+         
+  helper.h  +------------------>  + filter.c + -------> filter.o +      +--------+
+------------+        |            +----------+                   |      +        +
                      |                                           |      + .elf   +
                      |                                           +--->  +        +
                      +--------->  +-----------+                         +  or    +
                                   + helper.c  + ------> helper.o ---->  + .out   +
                                   +-----------+                  +--->  +--------+
                                                                  |          ^
        +-------------+                                           |          |
        + filter.h    +---------> +-------------+                 |          |
        +-------------+           + main.c      + -----> main.o---+          | 
                                  +-------------+                            |  
                                                                             |
                                                         +-------------------+
                                                         + libs (e.g. stdio) +
                                                         +-------------------+


推荐阅读