【发布时间】:2021-11-25 04:34:50
【问题描述】:
考虑以下代码sn-p:
#define FOO() BAR
#define BAR() FOO
FOO()()()
C 标准告诉我们,在参数替换等之后,由宏调用产生的预处理标记被重新扫描以获取更多宏名称,忽略生成它们的宏的名称(c99,6.10.3.4p1- 2)
因此,我希望预处理器将 sn-p 转换为 BAR()(),然后是 FOO(),然后停止,因为令牌 FOO 是宏 FOO 的结果,并且不是t 被识别为宏名称。
但是 GCC 和 clang 都给了我结果BAR,表明它实际上是在扩大一次。仅当宏的调用“发生”在参数列表(其中不再忽略宏名称FOO)而不是宏名称本身时,这才有意义。这是非常不直观的,我发现标准中没有提到它。我错过了什么?
提前致谢!
【问题讨论】:
-
不太相似...这个问题的答案很简单,“c 预处理器只执行一次”
标签: c macros language-lawyer c-preprocessor c99