do {} while(0)的意义

时间:2013-05-06 11:38:30

标签: c do-while

while循环中的条件为0时,do while循环的意义是什么,即始终为false。

do
{

//some code implementation.

}while(0);

我在很多地方都看到过这种情况。它的重要性是什么,我们只是省略do while(0)。因为两种方式代码只会被执行一次。

这不是重复,因为我询问使用while(0)条件,特别是一般的do-while循环。

3 个答案:

答案 0 :(得分:2)

它可用于在不离开函数的情况下在任何点保留一定范围的代码。考虑:

do
{
  beginAtomicOperationSequence();

  ret = doSomething();
  if (ret < 0) break;

  ret = doSomething2();
  if (ret < 0) break;

} while(0);

if (ret < 0) {
  switch (ret) {
   //handle error
  }
  rollbackAboveOperations();
} else {
  commitAboveOperations();
}

在某些情况下,我会说这是可以接受的,特别是如果需要制作一系列被视为原子的操作。就像上面的例子一样。

答案 1 :(得分:2)

它确保宏始终表现相同,无论在调用代码中如何使用分号和花括号。

有关详细信息,请参阅this

答案 2 :(得分:0)

该上下文中的do { } while(0)构造是一种混淆的方式来编写goto而不实际写出来。货物崇拜程序员使用它来读取那些糟糕但不明白的原因。

这里的Dariusz答案的例子用适当的goto和有意义的标签重写。

  beginAtomicOperationSequence();

  ret = doSomething();
  if (ret < 0) goto handle_error;

  ret = doSomething2();
  if (ret < 0) goto handle_error;

  ...

handle_error:
  if (ret < 0) {
    switch (ret) {
    //handle error
    }
    rollbackAboveOperations();
  } else {
    commitAboveOperations();
  }

可以看出,它更短,更明显。你甚至不得不问这个结构的目的,这表明它是一个坏主意

我的回答非常激烈,因为我有一位同事在我们的项目中使用和滥用它,我没有找到1个重新命名的值。当你在混音中添加一些真正的循环时,它会变得更加烦人。然后,乐趣开始找到breakcontinue将引导您前往的位置。

编辑: 这里链接到Linus Torvald关于goto主题的咆哮。 http://kerneltrap.org/node/553/2131