do { } while(0)
そのコンテキストでの構文は、gotoを実際に書き出さずに書き込む難読化された方法です。これは、goto が悪いとどこかで読んだが、その理由を理解していないカーゴ カルト プログラマーによって使用されます。
goto
これは、適切で意味のあるラベルで書き直された Dariusz の回答の例です。
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つも見つからなかったので、私は私の答えに熱心です。ミックスにいくつかの実際のループを追加すると、さらに煩わしくなります。それから、楽しみがあなたをどこに導くかを見つけ始めbreak
ますcontinue
。
編集: goto に関する Linus Torvald の暴言へのリンクです。
http://kerneltrap.org/node/553/2131