プログラムの流れを変更するためにマクロを使用するのは悪い考えです。コードを読んでいる人(数年後)がプログラムの流れで予期せぬジャンプによって驚くかもしれないからです。
しかし、あなたの問題は三項演算子とは関係ありません。実際には、三項演算子は右辺にブレークを含むことはできません。式のみです。このマクロの主な問題は、それを使用しているとき、人々は;
を書きます、そしてそれは他の間で使用されている場合、それはひどく破壊されるということです
#define ifcount(i,j) if ((i)==(j)) { count=count+1; break; }
:あなただけ行うことができますので
しかしマクロは、allmightyあります括弧なしのif /else
ペア:
if (...)
ifcount(a,b);
else // <--- syntax error because the previous ; breaks the if /else relation
...;
標準溶液をdo/while(0)
イディオムを使用することである。
#define do { ifcount(i,j) if ((i)==(j)) { count=count+1; break; } } while (0)
しかし、これはbreak
があなたが望むものではなく、while
というこの内部を破るため、動作しません(@abelenkyへのクレジット)。
複合文を可能にし、;
で終わるだけで、他のCの文は、このいずれかになります。
#define ifcount(i,j) if ((i)==(j)) { count=count+1; break; } else
問題ではなく、コンパイラエラーのため、あなたはifcount(i,j)
を使用しているとき;
を追加するのを忘れた場合ということですあなたは静かに編集し、驚くほど行動を変えるでしょう。
なぜあなたはそれを三元に変換する必要があると思いますか?マクロ内に 'if'を書くことができます。改行でバックスラッシュを忘れないでください。 –
マクロを乱用しないでください。コードに改行を入れておけば、読んだ人には分かります。 – 2501
@haccks 2行目です。条件が真でない場合には何も起こりません。 – Terminator