do {} while(0)的意义

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

do { //some code implementation. }while(0); 

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

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

它可用于在任何点保留一定范围的代码而无需离开函数。 考虑:

 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(); } 

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

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

有关详细信息,请参阅此处

在该上下文中的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