1. ホーム
  2. c

[解決済み] マクロを定義するときにdo while(0)を使うとどうなりますか?重複

2022-07-05 15:31:42

質問

重複の可能性があります。

C/C++ マクロにおける Do-While および if-else ステートメント

do { ... } while (0) - それは何のために良いのですか?

linux kernelを読んでいると、このようなマクロがたくさん出てきます。

#define INIT_LIST_HEAD(ptr) do { \
    (ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)

単純に{}で定義するのではなく、なぜこれを使うのでしょうか?

どのように解決するのですか?

セミコロンでフォローし、より関数のように見せたり動作させたりすることができます。 また、if/else句を適切にその後で動作させます。

while(0)がなければ、上のコードは次のように動作しません。

if (doit) 
   INIT_LIST_HEAD(x);
 else 
   displayError(x);

のように、マクロの後にセミコロンを付けると、else 節が "eat" となり、上記はコンパイルすらできません。