c - 头文件中的函数如何链接到 .c 文件?
问题描述
在第4题中cs50
,有一个main函数filter.c
,它使用了头文件helper.h
。后者包含了几个函数的原型,这些完整的函数写在helper.c
我的问题是:既然filter.c
只连接到helper.h
,它如何连接到函数的代码?或者 filter.c 是否也会自动查找与链接头文件同名的 .c 文件?
我希望这有点清楚!
解决方案
程序的编译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.c
main.c
.o
.obj
objects
一起成为并完全可执行(链接器还链接来自预定义库的所有函数,例如 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) +
+-------------------+
推荐阅读
- java - 从 .txt 文件构建的二维数组的问题
- mysql - 为什么我在 LAG() 函数中出现语法错误?
- tensorflow - 是否可以在图层之间映射数据集的批量大小?
- json - SQL Server 将分隔字符串拆分为 JSON 数组
- java - Apache Karaf 启动 ArrayIndexOutOfBoundsException: 19
- firebase - 无法以正确的顺序显示上传到 firebase 商店的图片
- javascript - 无法让数组呈现以查看
- python - 数据帧数组,获取每个数据帧的最大值并在 Pandas 中求和
- c# - 在 C# 中声明引用会消耗任何内存吗?
- reactjs - 如何替换现有数据(键/值对)而不是通过不可变的 js 附加到数组?