こんな感じで書かれたマクロを見ることがある。 #define SWAP(x, y) do { int temp = x; x = y; y = temp; } while(0) do-while(0)で囲んでいるのは、ブロックで囲まれていないif文での意図しない動作を防ぐため。 例えば、以下の場合に有効。 /* do-while(0)で囲まれていない場合 */ #define SWAP(x, y) { int temp = x; x = y; y = temp; } if (hoge) SWAP(x, y); else x = 0; これは、以下のように展開され、文法エラーになる。 if (hoge) { int temp = x; x = y; y = temp; } ; else x = 0; 文法エラーで済むのならいいけど、以下の場合には意図しない制御になり致命的。 if (1) i