宏观范围守卫

时间:2011-07-03 09:20:10

标签: c macros

  

可能重复:
  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)        

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

以前问过这个问题:C multi-line macro: do/while(0) vs scope block

Here's another link有几个理由这样做,以及为什么要在最后省略分号。

答案 2 :(得分:0)

编辑重新编辑

在文学中我总是记得形式do {..} while(0)(有时甚至用;,但这种形式被证明是错误的)。由于宏是字面替换,很容易想象允许{ }do { } while(0)不允许,或者当您需要MACRO表现得像“语句”时会有区别({ };不要,而do { } while(0);会这样做;例如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,而第二个形式是正确的(如果宏有最后的那个;我记得已经看到某个地方,同样的错误第一种形式出现)