【问题标题】:Macro scope guards [duplicate]宏观范围守卫[重复]
【发布时间】:2011-09-27 13:42:30
【问题描述】:

可能的重复:
Why are there sometimes meaningless do/while and if/else statements in C/C++ macros?
What's the use of do while(0) when we define a macro?

有没有区别

#define MACRO(x)  \
    {             \
    ...           \
    }         

#define MACRO(x)   \
    do {           \
    ...            \
    } while(0)        

?

【问题讨论】:

  • 有没有办法让asker关闭?
  • 我不确定我是否同意这个问题专门询问为什么 {} while(0) 但没有将它与看起来更干净的 {} 进行比较,否则您可能会使用

标签: c macros


【解决方案1】:

嗯,第二个感觉更自然,因为它在使用后总是需要一个分号。

【讨论】:

    【解决方案2】:

    重新编辑

    在文学作品中,我始终记得do {..} while(0) 的形式(有时甚至使用 ;,但这种形式被证明是错误的)。由于宏是文字替换,因此很容易想象,当{ } 被允许但do { } while(0) 不被允许,或者当您需要 MACRO 的行为类似于“语句”时({ }; 不允许,而 @987654325 @ 确实;一个例子是 if / else(if) 的情况:

       if (COND)
       {          // MACRO(..);         
          ...  
       };
       else
       {      // this is an else without if
       }
    

    同时

       if (COND)
         do {        // MACRO(..);
          ...
         } while(0);
       else
       {
         // this work properly
       }
    

    所以第一个有一个 void 语句,从语法上讲不可能将 else “加入”到它的 if,而第二种形式是正确的(如果宏有 final ;我记得在某处看到过,同样的错误第一种形式发生)

    【讨论】:

    • 它们是不同的 - 尝试在 if 后面加上 else
    • 哎呀,对,我的第一个“印象”比第二个想法更正确。打算重新修复它
    【解决方案3】:

    do { ... } while(0) 允许在条件代码中使用宏。

    这个问题之前好像有人问过:C multi-line macro: do/while(0) vs scope block

    Here's another link 说明这样做的几个原因,以及为什么要在末尾省略分号。

    【讨论】:

    • 如果您看到重复请关闭它,如果您有声誉或者如果没有标记它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2012-06-30
    • 2017-11-27
    • 2013-03-31
    • 2012-04-01
    相关资源
    最近更新 更多