1. ホーム
  2. c

[解決済み] do { ... } while (0) - 何のために良いですか?[重複]する

2022-03-26 06:03:19

質問

<ブロッククオート

重複の可能性があります。
C/C++のマクロで無意味なdo/whileやif/else文があることがあるのはなぜですか?

その表現、もう10年以上前から見ていますよ。何のためにあるのか考えてみました。主に#definesで見かけるので、インナースコープの変数宣言と、(gotoの代わりに)breakを使うのに適しているのだと思います。

他に何か良いことがあるのでしょうか?あなたはそれを使いますか?

解決方法は?

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
    ....