在C99标准中,第10.3.5节的示例3演示了f的宏扩展(修改):
#define f(a) f(a)
#define z z[0]
f(z)
扩展的结果是“f(z[0])”,这对于 MSVC 和 GCC 也是如此。但我无法弄清楚为什么结果不是“f(z[0][0])”,这可能是由以下宏扩展序列导致的:
f(z[0])
f(z[0])
f(z[0][0])
这与正确结果明显不同。 z 的两个扩展是完全独立的,因此不适用递归预防。但是,不执行 z 扩展之一。为什么?
请帮助我理解我错在哪里
显然,所有预处理器都会产生正确的结果,因此了解这里到底发生了什么对我来说很重要。
预处理器取代了标记。
z
正在被 z[0]
f(a)
因为 a
是 z[0]
,它被 f(z[0])
取代。这些宏中不再需要替换,因为所有内容都已预处理。