マクロをdo-while(0)で囲むワケ
こんな感じで書かれたマクロを見ることがある。
#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) if (1) SWAP(x, y); else ;
ちなみに、if文を{}で必ず囲めば、マクロをdo-while(0)で囲む必要もなく全て解決。
ifは必ず{}で囲もう。
参考ページ
Super Technique 講座〜マクロの技