我开始阅读计算机系统:程序员的观点(Beta草案)一书。它解释了从C源到可执行程序的系统编译,以及本书中的示例代码:
#include <stdio.h>
int main()
{
printf("hello, world\n");
}
我无法理解,为什么预处理器必须将源文本上的系统头文件 stdio.h 的内容作为文本?由于组成 printf 功能的机器代码与在链接阶段组成示例源代码的机器代码合并,当 #include
System compilation picture from the book
我弄错了吗?或者有什么我不知道的所有这些阶段?
答案 0 :(得分:1)
为什么预处理器必须将源文本上的系统头文件stdio.h的内容作为文本?
这是#include
的重点 - 你还期望#include
做什么?
由于组成printf函数的机器代码与在链接阶段组成示例源代码的机器代码合并,
#include
与机器代码无关。它仅适用于源代码。
检测到#include指令时,在源代码文本中插入了什么?
stdio.h的内容。如果您使用的是Linux系统,可以在/usr/include/stdio.h找到此文件。如果您使用的是Windows,则可能需要搜索Program Files。
请注意,stdio.h中定义的printf
不是;它只是宣布。
如果您想知道完全预处理后源文件的样子,并且您正在使用GCC,则可以运行gcc -E nameofyoursourcefile.c
我弄错了吗?或者有什么我不知道的所有这些阶段?
您认为printf
的源代码在stdio.h中。事实并非如此。