#include <stdio.h>
#define X (Y+4)
#define Y (X+3)
int main(void) {
printf("%d\n",4*X+2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误:未定义的符号'X'.
宏扩展不会递归地重新扩展宏名称.
引用C标准:
如果在替换列表的扫描期间找到要替换的宏的名称(不包括源文件的其余预处理标记),则不会替换它.此外,如果任何嵌套替换遇到要替换的宏的名称,则不会替换它.这些未替换的宏名称预处理令牌不再可用于进一步替换,即使它们稍后(重新)检查在其中否则将替换该宏名称预处理令牌的上下文中.
X扩展到(Y + 4).然后预处理器尝试扩展Y,但由于扩展Y指的是X,它不会再次扩展它,而是将其保留X到位.
此规则避免了宏扩展中的无限递归(如果此规则不存在,那么您的示例中就会有这种递归).
经过宏观扩张,行
printf("%d\n",4*X+2);
Run Code Online (Sandbox Code Playgroud)
解析为:
printf("%d\n",4*((X+3) +4)+2);
Run Code Online (Sandbox Code Playgroud)
由于X尚未以预处理器外部可见的方式定义,因此存在编译时错误.