C预处理器有多少次传递?

C预处理器对代码进行了多少次传递?

我在gcc 4.7.2上测试了以下代码

#define a 5 #define ba #define cb #define dc #define ed #define fe #define gf #define hg #define jh #define kj #define lk #define ml int main(void) {return d;} 

没有错误:

 $ gcc -E 1.c # 1 "1.c" # 1 "" # 1 "1.c" # 14 "1.c" int main(void) {return 5;} 

这是标准行为吗?

C预处理器继续前进,直到没有其他扩展。 这不是通行证的问题; 这是一个完整性的问题。

它确实避免了宏的递归扩展。 一旦宏展开一次,它就不会在替换文本中重新展开。


标准中关于宏扩展限制的唯一内容是§5.2.4.1翻译限制,其中说:

该实现应能够翻译和执行至少一个包含以下每个限制的至少一个实例的程序: 18)

  • 在一个预处理转换单元中同时定义的4095个宏标识符

18)实施应尽可能避免强加固定的翻译限制。

因此,预处理器必须能够处理至少4095个宏,并且如果除了其中一个宏之外的所有宏都按顺序扩展到另一个宏,就像在您的示例中一样,结果必须正确。