是C预处理器的多通道操作

Is the C preprocessor multi-pass in operation?

本文关键字:多通道 操作 处理器 预处理      更新时间:2023-10-16

我最近遇到了"多遍编译器"这个术语。从本质上讲,任何编译器都可以通过多次传递来解析源代码。

这让我思考,C预处理器是多通道操作吗?

假设我有下面的C代码。

int bar = foo;
#define foo 1

在传递过程中,唯一可行的方法是预处理器在代码中查找预处理器指令,然后返回代码进行替换。

这就是预处理器的工作方式吗?

这让我思考,C预处理器是多通道操作吗?

它不一定是,而且通常不是。

int bar = foo;
#define foo 1

宏仅从其定义点(#define行)到文件末尾(或对应的#undef)可见。在上文中,第一行是而不是int bar = 1;替换;相反,它保持为int bar = foo;,只有在已经声明了foo的情况下才有效。(该声明将被#define隐藏,但仅适用于宏定义之后的引用。)

预处理器的行为(更准确地说,前几个翻译阶段的行为)被设计为允许单次通过实现。本规范见C标准(N1570为最新草案)第5.1.1.2节。"预处理器"通常对应于阶段1到4,或者可能对应于阶段5。