何らかの理由でマクロを作成する必要があるとしましょうMACRO(X,Y)
。 (インライン関数を使用できない正当な理由があると仮定しましょう。) このマクロで、戻り値のない関数の呼び出しをエミュレートする必要があります。
例1:これは期待どおりに機能するはずです。
if (x > y)
MACRO(x, y);
do_something();
例2:これによってコンパイラエラーが発生することはありません。
if (x > y)
MACRO(x, y);
else
MACRO(y - x, x - y);
例3:これはコンパイルされるべきではありません。
do_something();
MACRO(x, y)
do_something();
マクロを書くための素朴な方法は次のようなものです。
#define MACRO(X,Y) \
cout << "1st arg is:" << (X) << endl; \
cout << "2nd arg is:" << (Y) << endl; \
cout << "Sum is:" << ((X)+(Y)) << endl;
これは3つの例すべてに失敗する非常に悪い解決策であり、その理由を説明する必要はありません。
マクロが実際に何をするかは無視してください。それは重要ではありません。
さて、私が最もよく書くマクロを見る方法は、次のように中かっこで囲むことです。
#define MACRO(X,Y) \
{ \
cout << "1st arg is:" << (X) << endl; \
cout << "2nd arg is:" << (Y) << endl; \
cout << "Sum is:" << ((X)+(Y)) << endl; \
}
これは、マクロが1つのステートメントブロックにあるため、例1を解決します。ただし、マクロの呼び出しの後にセミコロンを付けるため、例2は壊れています。これにより、コンパイラはセミコロン自体がステートメントであると見なします。つまり、elseステートメントはifステートメントに対応しません。最後に、例3は、セミコロンがない場合でも、コードブロックにセミコロンが必要ないため、正常にコンパイルされます。
3つの例すべてに合格するようにマクロを作成する方法はありますか?
注:私はヒントを共有するための受け入れられた方法の一部として自分の回答を提出していますが、誰かがより良い解決策を持っている場合は、ここに投稿してください。私の方法よりも多くの票を獲得する可能性があります。:)