三項条件演算子というものがありますね。
expr ? then : else;
これは実に見にくいものです。
これだけならまだいいのですが、
expr ? then : expr ? then : else;
このようにネストさせると途端に見にくく、醜くなるものです。
じゃあ使わなけりゃいいじゃん、てまあ、それはそうなのですが、どうしても使いたいときもあるんです。
これを使う一番の利点は、この条件演算子は文、statementではなく、式、expressionであるという点です。
if 〜 elseは 文ですね。
式であるということは、
int ary[sizeof(long) > 4 ? 8 : 4];
のような使い方ができるということです。
この例はあまり実用的とは言えませんが、c++11のconstexpr関数など、重宝する場面も少なくありません。
そこで解法として、
#define IF_EXP( expr ) ( expr ) ?
#define ELSE_EXP :
を使います。
IF_EXP( exp ) then
ELSE_EXP IF_EXP( exp ) then
ELSE_EXP else;
ま、多少は見やすくなったのではないでしょうか。
マクロの使用は忌み嫌うべきものなので、長い使いづらい名前を敢えて付け、決してライブラリから垂れ流すようなことはせず、必要最小限の使用に留めて、使い終わったらすぐに#undef
することが大切です。少なくとも、マクロの使用されている画面からマクロの定義が見える範囲が許容範囲でしょう。
用法、容量を守ればマクロは強力な機能です。
可読性を損なわないように美しく使いましょう。