私にとってdo{...}while(0)
は大丈夫です。を表示したくない場合はdo{...}while(0)
、代替キーワードを定義できます。
例:
SomeUtilities.hpp:
#define BEGIN_TEST do{
#define END_TEST }while(0);
SomeSourceFile.cpp:
BEGIN_TEST
if(!condition1) break;
if(!condition2) break;
if(!condition3) break;
if(!condition4) break;
if(!condition5) break;
//processing code here
END_TEST
while(0)
コンパイラは、バイナリ バージョンの不要な条件を削除しdo{...}while(0)
、ブレークを無条件ジャンプに変換すると思います。アセンブリ言語のバージョンを確認してください。
を使用goto
すると、よりクリーンなコードも生成され、条件後ジャンプ ロジックを使用すると簡単です。次のことができます。
{
if(!condition1) goto end_blahblah;
if(!condition2) goto end_blahblah;
if(!condition3) goto end_blahblah;
if(!condition4) goto end_blahblah;
if(!condition5) goto end_blahblah;
//processing code here
}end_blah_blah:; //use appropriate label here to describe...
// ...the whole code inside the block.
ラベルはクロージングの後に配置されることに注意してください}
。goto
これは、ラベルが表示されなかったために誤って間にコードを挿入してしまうという問題を回避するためです。do{...}while(0)
条件コードなしのようになりました。
このコードをよりクリーンで分かりやすくするには、次のようにします。
SomeUtilities.hpp:
#define BEGIN_TEST {
#define END_TEST(_test_label_) }_test_label_:;
#define FAILED(_test_label_) goto _test_label_
SomeSourceFile.cpp:
BEGIN_TEST
if(!condition1) FAILED(NormalizeData);
if(!condition2) FAILED(NormalizeData);
if(!condition3) FAILED(NormalizeData);
if(!condition4) FAILED(NormalizeData);
if(!condition5) FAILED(NormalizeData);
END_TEST(NormalizeData)
これにより、ネストされたブロックを実行し、終了/ジャンプアウトする場所を指定できます。
BEGIN_TEST
if(!condition1) FAILED(NormalizeData);
if(!condition2) FAILED(NormalizeData);
BEGIN_TEST
if(!conditionAA) FAILED(DecryptBlah);
if(!conditionBB) FAILED(NormalizeData); //Jump out to the outmost block
if(!conditionCC) FAILED(DecryptBlah);
// --We can now decrypt and do other stuffs.
END_TEST(DecryptBlah)
if(!condition3) FAILED(NormalizeData);
if(!condition4) FAILED(NormalizeData);
// --other code here
BEGIN_TEST
if(!conditionA) FAILED(TrimSpaces);
if(!conditionB) FAILED(TrimSpaces);
if(!conditionC) FAILED(NormalizeData); //Jump out to the outmost block
if(!conditionD) FAILED(TrimSpaces);
// --We can now trim completely or do other stuffs.
END_TEST(TrimSpaces)
// --Other code here...
if(!condition5) FAILED(NormalizeData);
//Ok, we got here. We can now process what we need to process.
END_TEST(NormalizeData)
スパゲッティ コードは のせいではなくgoto
、プログラマーのせいです。を使用しなくてもスパゲッティ コードを生成できますgoto
。