预处理器宏扩展(ISO/IEC 9899:1999 (E) §6.10.3.5 示例 3)

问题描述 投票:0回答:1

在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])”,这可能是由以下宏扩展序列导致的:

  • 在参数宏扩展期间,z参数被替换为z[0]:
    f(z[0])
  • “f(z[0])”替换为“f(z[0])”:
    f(z[0])
  • 重新扫描时,z再次替换为z[0]:
    f(z[0][0])

这与正确结果明显不同。 z 的两个扩展是完全独立的,因此不适用递归预防。但是,不执行 z 扩展之一。为什么?

请帮助我理解我错在哪里

显然,所有预处理器都会产生正确的结果,因此了解这里到底发生了什么对我来说很重要。

c macros preprocessor
1个回答
0
投票

预处理器取代了标记。

  1. z
    正在被
    z[0]
  2. 取代
  3. f(a)
    因为
    a
    z[0]
    ,它被
    f(z[0])
    取代。

这些宏中不再需要替换,因为所有内容都已预处理。

© www.soinside.com 2019 - 2024. All rights reserved.