マクロを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 講座〜マクロの技