下面的代码如何工作,换句话说C预处理器的算法是什么?这适用于所有编译器吗?
#include <stdio.h>
#define b a
#define a 170
int main() {
printf("%i", b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它位于 §6.10.3(宏替换):
6.10.3.4 重新扫描和进一步更换
1) 在替换列表中的所有参数都被替换并且#和##处理已经发生后,所有的地标预处理标记被删除。然后,重新扫描生成的预处理标记序列以及源文件的所有后续预处理标记,以替换更多宏名称。
进一步的段落陈述了一些补充规则和例外,但基本上就是这样。
尽管它可能违反了“单程”的某些定义,但它非常有用。就像对包含文件的递归预处理一样(第 5.1.1.2p4 节)。