ウォンツテック

そでやまのーと

以前apacheのソースを読んでて、APRにあるマクロで

#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 {
    ...
  }

とやっているなら問題なし。