C预处理器的工作

shr*_*sva 4 c c-preprocessor

下面的代码如何工作,换句话说C预处理器的算法是什么?这适用于所有编译器吗?

#include <stdio.h>

#define b a
#define a 170


int main() {
  printf("%i", b);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 9

预处理刚刚替换ba的地方找到它的程序,然后替换a170这只是普通的文本替换.

适用于gcc.


aib*_*aib 5

它位于 §6.10.3(宏替换):

6.10.3.4 重新扫描和进一步更换

1) 在替换列表中的所有参数都被替换并且#和##处理已经发生后,所有的地标预处理标记被删除。然后,重新扫描生成的预处理标记序列以及源文件的所有后续预处理标记,以替换更多宏名称。

进一步的段落陈述了一些补充规则和例外,但基本上就是这样。

尽管它可能违反了“单程”的某些定义,但它非常有用。就像对包含文件的递归预处理一样(第 5.1.1.2p4 节)。