1 预处理阶段

编译过程从你要编译的各种源文件开始(可能只有一个源文件,但大型程序通常由许多文件组成)。这不仅使得项目更易于管理,而且加快了编译速度,因为如果一个文件发生了更改,只需重新编译该文件而不是所有代码。

C的源文件包含宏(用#define表示)和#include指令。可以使用#include指令包含源文件所依赖的头文件(扩展名为.h)。

预处理阶段扩展了源文件中的所有#define和#include指令,因此剩下的就是准备编译的纯C代码。

image-20220922213822968

默认情况下,GCC会自动执行所有的编译阶段,因此必须明确告诉它在预处理后停止,并显示中间输出。

对GCC来说,这可以使用命令gcc -E -P来完成,其中-E告诉GCC在预处理后停止,-P使GCC忽略调试信息,以便输出更清晰。

image-20220922213955651

==stdio.h头文件全部包含在内,其所有的类型定义、全局变量及函数原型都被“复制”到源文件中。==因为每个#include指令都会发生这种情况,所以预处理器输出可能非常冗长。==预处理器还完整地扩展了#define定义的任何宏的所有用法。==在示例中,这意味着对printf(FORMAT_STRING❶和MESSAGE❷)的两个参数进行计算,并用它们所代表的常量字符串进行替换。