5

重複の可能性:
C /C++マクロに意味のないdo/whileおよびif/elseステートメントがあるのはなぜですか?

プリプロセッサマクロ内で複数のステートメントを実行する必要がある場合、通常は次のように記述されます。

#define X(a) do { f1(a); f2(a); } while(0)

したがって、このマクロが次のような式の中で使用される場合:

if (...)
    X(a);

それは台無しにされないでしょう。

問題は、私がそのような表現を見たところはどこでも、それは常にdo { ... } while(0);です。(私の意見ではより明確な)そのような概念を好む理由はありますif (1) { ... }か?それとも私は私の観察で間違っていて、それらは等しく人気がありますか?

4

5 に答える 5

9

いいえ、あなたは間違っていません。

実際には素晴らしい理由があります。

#define my_code if (1) { ... }

if (1)
    my_code;

問題は;! そこにあるべきではありません...そして、それは奇妙に見え、言語の精神に合わないでしょう. ;連続して 2 つに展開するコード、またはc らしくないコードのいずれかを選択できます:)

一方、do-while建設にはその問題はありません。


また、他の人が述べたように、else問題があります:

if (1)
    my_code;
else { ... }

問題を無視する;と、elseブロックは間違った if に属します。

于 2012-05-23T13:04:47.240 に答える
7

ifブランチdo/whileがある場合と同じくらい安全です。else例えば:

#define X(a) if(1) { f1(a); f2(a); } else{}

次のように安全です。

#define X(a) do { f1(a); f2(a); } while(0)

ユーザーができないように:

X(...) else ...;

1 つの違いは、それを使用する場合は末尾にdo/whilea が必要ですが、そうではないことです。;if/else

于 2012-05-23T13:03:43.000 に答える
5

このことを考慮:

if(foo)
    X(a);
else
    whatever();

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

if(foo)
    if(1) { ... }
else
    whatever();

else が間違った if に属しているため、これは悪いことです。

于 2012-05-23T13:04:55.497 に答える
2

を使用すると、必要に応じて外出do... whileできます。break

于 2012-05-23T13:04:09.307 に答える
2

formを使用すると、ステートメントの最後に#define X(a) do { ... } while(0)を配置することが強制されます。;X(1)

于 2012-05-23T13:04:20.967 に答える