do { ... } while (0) — これは何の役に立つのでしょうか? [重複] 質問する

do { ... } while (0) — これは何の役に立つのでしょうか? [重複] 質問する

私はもう 10 年以上この式を見ています。この式が何に役立つのか考えてきました。#define でよく見かけるので、内部スコープ変数の宣言や、goto の代わりに break を使用するのに適していると思います。

他に何か良いことはありますか?使っていますか?

ベストアンサー1

これは、C でマルチステートメント操作に使用でき#define、その後にセミコロンを置いても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
    ....

おすすめ記事