do { ... } while (0) — 何の役に立つの?

#define に使用できる C の唯一の構造です。 複数ステートメントの操作、セミコロンを後ろに置き、if 内で引き続き使用 声明。例が役立つかもしれません:

#define FOO(x) foo(x); bar(x)

if (condition)
    FOO(x);
else // syntax error here
    ...;

中括弧を使用しても役に立ちません:

#define FOO(x) { foo(x); bar(x); }

これを if で使用する このステートメントでは、直感に反するセミコロンを省略する必要があります:

if (condition)
    FOO(x)
else
    ...

FOO を次のように定義すると:

#define FOO(x) do { foo(x); bar(x); } while (0)

その場合、次は構文的に正しいです:

if (condition)
    FOO(x);
else
    ....

これは、エラー チェックを簡素化し、深いネストされた if を回避する方法です。例:

do {
  // do something
  if (error) {
    break;
  }
  // do something else
  if (error) {
    break;
  }
  // etc..
} while (0);

複数のステートメントを 1 つのステートメントにグループ化すると、関数のようなマクロを実際に関数として使用できるようになります。あなたが持っていると仮定します:

#define FOO(n)   foo(n);bar(n)

void foobar(int n) {
  if (n)
     FOO(n);
}

これは次のように展開されます:

void foobar(int n) {
  if (n)
     foo(n);bar(n);
}

2 番目の呼び出し bar(n) に注意してください if の一部ではありません

両方を do { } while(0) にラップします 、および if でマクロを使用することもできます