可能性の重複:
Do-While and if-else statements in C/C++ macrosマクロを定義するときにdo(0)を使うのは何ですか?
私はLinuxカーネルを読んでいると私は、このような多くのマクロが見つかりました:彼らはこれを使用するのではなく定義しないのはなぜ
#define INIT_LIST_HEAD(ptr) do { \
(ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
をそれは単に{}でですか?
しかし、OPの質問には、略:
編集。 do {(ptr) - > next ...}ではなく{(ptr) - > next ...}なぜ(0);? –
アルノはそれを説明しました。それは "{(ptr) - > next ...};に展開されます;"したがって、ステートメントの後に2番目のステートメントが続きます。 if if(expression)else else文です。 "if(expression)statement文"(1つの "{...}"文と1つの ";"文)を記述しているので、elseはifに関連付けられません。 –
Amoは言ったように、マクロをセミコロンで終わらなければならないCステートメントにすることを賢明にしています。ステートメントの作成と終了( ';'付き)に関しては、マクロは関数呼び出しとまったく同じように動作します。 – Eddie