在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])",这可能是以下宏展开序列的结果:
- during arguments macro expansion, z argument is replaced with z[0]:
f(z[0])
- "f(z[0])" is replaced with "f(z[0])":
f(z[0])
- during rescan, z is replaced with z[0] again:
f(z[0][0])
这显然与正确的结果不同.Z的两个展开是完全分开的,因此不适用递归预防.但是,不会执行其中一个z展开.为什么?
请帮助我理解我错在哪里
显然,所有的预处理器都会产生正确的结果,所以了解这里到底发生了什么对我来说很重要.