C预处理器对代码进行了多少次传递?
我在gcc 4.7.2
上测试了以下代码#define a 5
#define b a
#define c b
#define d c
#define e d
#define f e
#define g f
#define h g
#define j h
#define k j
#define l k
#define m l
int main(void) {return d;}
没有错误:
$ gcc -E 1.c
# 1 "1.c"
# 1 "<command-line>"
# 1 "1.c"
# 14 "1.c"
int main(void) {return 5;}
这是标准行为吗?
答案 0 :(得分:14)
C预处理器继续前进,直到没有其他扩展。这不是通行证的问题;这是一个完整性的问题。
它确实避免了宏的递归扩展。宏扩展一次后,不会在替换文本中重新展开。
标准中关于宏扩展限制的唯一内容是§5.2.4.1翻译限制,其中说:
实现应能够翻译和执行至少一个程序 包含以下每个限制的至少一个实例: 18)
...
- 在一个预处理翻译单元中同时定义的4095个宏标识符
18)实施应尽可能避免强加固定的翻译限制。
因此,预处理器必须能够处理至少4095个宏,并且如果除了其中一个宏之外的所有宏都按顺序扩展到另一个宏,就像在您的示例中一样,结果必须正确。