预处理器和宏

当编译器遇到代码中的宏时,它执行简单的字符串替换,不执行其他操作。因此,预处理器的更改不会考虑 C 程序的范围 - 例如,宏定义不限于在块内,因此不受结束块语句的'}'的影响。

根据设计,预处理器并不完整 - 有几种类型的计算单独由预处理器完成。

通常编译器有一个命令行标志(或配置设置),允许我们在预处理阶段后停止编译并检查结果。在 POSIX 平台上,这个标志是 -E。因此,使用此标志运行 gcc 会将扩展的源打印到 stdout:

$ gcc -E cprog.c

通常,预处理器是作为一个单独的程序实现的,由编译器调用,该程序的通用名称是 cpp。许多预处理器发出支持信息,例如有关行号的信息 - 后续编译阶段使用这些信息来生成调试信息。在预处理器基于 gcc 的情况下,-P 选项会抑制此类信息。

$ cpp -P cprog.c