做{...} while(0) - 有什么好处?

可能重复:
为什么在C / C ++宏中有时会出现无意义的do / while和if / else语句?

我已经看到这个表达超过10年了。 我一直在想着它有什么好处。 由于我主要在#defines中看到它,因此我认为它适用于内部作用域变量声明和使用中断(而不是gotos)。

对其他任何东西都有好处吗? 你用它吗?


这是C语言中唯一可用于#define多语句操作的构造,在后面放置分号并仍在if语句中使用。 一个例子可能有助于:

#define FOO(x) foo(x); bar(x)

if (condition)
    FOO(x);
else // syntax error here
    ...;

即使使用大括号也无济于事:

#define FOO(x) { foo(x); bar(x); }

if语句中使用它会要求你省略分号,这是违反直觉的:

if (condition)
    FOO(x)
else
    ...

如果你像这样定义FOO:

#define FOO(x) do { foo(x); bar(x); } while (0)

那么以下语法正确:

if (condition)
    FOO(x);
else
    ....

这是一种简化错误检查并避免深层嵌套if的方法。 例如:

do {
  // do something
  if (error) {
    break;
  }
  // do something else
  if (error) {
    break;
  }
  // etc..
} while (0);

它有助于将多个语句分组到一个语句中,以便类似函数的宏实际上可以用作函数。 假设你有

#define FOO(n)   foo(n);bar(n)

你也是

void foobar(int n){
  if (n)
     FOO(n);
}

然后这扩展到

void foobar(int n){
  if (n)
     foo(n);bar(n);
}

注意第二个调用(bar(n))不再是if语句的一部分。

将两者封装在do {} while(0)中,并且还可以在if语句中使用宏。

链接地址: http://www.djcxy.com/p/84407.html

上一篇: do { ... } while (0) — what is it good for?

下一篇: C# switch statement limitations