■
#define APR_RING_SPLICE_AFTER(lep, ep1, epN, link) do { \ APR_RING_PREV((ep1), link) = (lep); \ APR_RING_NEXT((epN), link) = APR_RING_NEXT((lep), link); \ APR_RING_PREV(APR_RING_NEXT((lep), link), link) = (epN); \ APR_RING_NEXT((lep), link) = (ep1); \ } while (0)
こんなのがあったけど,do ... while(0)で囲む意味がわからなかったけど今日わかった。
このマクロを以下のようなコードで使う時
if (hoge == 0) APR_RING_SPLICE_AFTER(lep, ep1, epN, link); else ...
このマクロを do .. while(0)ではなくただのブロック{ }で囲むと
if (hoge == 0) { ... }; else ...
となりエラーになってしまうのでこれを防ぐためにwhile(0)を使っているらしい。
ちなみにifを書くときは必ず
if (hoge == 0) { ... } else { ... }
とやっているなら問題なし。