考虑这段代码:
#define MAP_OUT
#define A(x) B MAP_OUT (x)
#define B(x) A MAP_OUT (x)
A(x)
Run Code Online (Sandbox Code Playgroud)
然后A(x)展开为B MAP_OUT (x), 那么B (x)。现在看一下标准:
在替换列表中的所有参数都已被替换并且 # 和 ## 处理已发生后,所有地标预处理标记都将被删除。然后重新扫描生成的预处理标记序列以及源文件的所有后续预处理标记,以查找更多要替换的宏名称。
是否B (x)属于“生成的预处理标记序列以替换更多宏名称”?我尝试过的所有编译器在单次扫描期间都不会扩展B (x),但是标准本身呢?