【问题标题】:Macro expansion in CC中的宏扩展
【发布时间】:2014-09-13 22:03:45
【问题描述】:

这个宏

#define f(x) x x
     f (1
     #undef f
     #define f 2
     f)

根据this link 扩展至此1 2 1 2

它实际上是这样做的,我已经用Xcode Product > Perform Action > Preprocess 进行了验证,但是在扩展这个宏时预处理器会遵循哪些步骤?

【问题讨论】:

  • 你对我的回答不满意吗?
  • @Étienne 已修复。谢谢你的解释。我从中学到了。
  • 谢谢,很高兴它有帮助;)

标签: c xcode macros c-preprocessor


【解决方案1】:

初始情况:

f (1
#undef f
#define f 2
f)

如果我们参考您提供的链接,宏将分两步进行预处理:

第 1 步:参数预扩展

如果在宏调用中,该宏被重新定义,那么新的 定义在参数预展开时及时生效

将用作类函数宏的参数的f替换为2:

f(1 f) -> f (1 2)

第 2 步:参数替换

但原定义仍用于参数替换

使用其原始定义解析类函数宏f

f(1 2) -> 1 2 1 2



整个事情其实等价于以下:

#define f(x) x x  
#define g 2
f(1 g)

【讨论】:

    【解决方案2】:

    我认为发生的情况如下,为了能够更好地可视化这些步骤,让我们通过添加区分括号来重写 #define 语句。

    步骤 0

    #define f(x) (x) [x]
    
    f (1
    #undef f
    #define f 2
    f)
    

    // 注意,这不会产生有效的 C 代码。我玩它是为了了解预处理所采取的行动,而不是编译它。如上所示,通过 Product > Action > Preprocess 查看预处理器的结果。

    因此,预处理器采取的第一步是替换,x 被替换为语句中提供的值(本例中为“1”),宏值中有 2 次 x,因此相同的替换发生了两次. () 和 [] 括号用于帮助区分 2 条路径:

    步骤 1

    (1
    #undef f
    #define f 2
    f) [1
        #undef f
        #define f 2
        f]
    

    然后是#undeff,它确实存在并将其重新定义为f 2

    第二步

    (1 f) [1 f]
    

    在最后一步,将f 简单替换为它当前携带的值,在本例中为2

    第三步

    (1 2) [1 2]
    

    就是这样。预期结果1 2 1 2 已被替换为地面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多