预处理器在系统编译流程中做了什么?

时间:2016-12-05 23:09:11

标签: c compilation

我开始阅读计算机系统:程序员的观点(Beta草案)一书。它解释了从C源到可执行程序的系统编译,以及本书中的示例代码:

#include <stdio.h>

int main()
{
    printf("hello, world\n");
}

我无法理解,为什么预处理器必须将源文本上的系统头文件 stdio.h 的内容作为文本?由于组成 printf 功能的机器代码与在链接阶段组成示例源代码的机器代码合并,当 #include

System compilation picture from the book

我弄错了吗?或者有什么我不知道的所有这些阶段?

1 个答案:

答案 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中。事实并非如此。