1 つのマクロを、1 つの特定の引数値と他のすべての引数に対して異なる方法で展開することは可能ですか?
現在のユーザーを定義するとします。
#define CURRENT_USER john_smith
私ができるようにしたいのは、ユーザーが一致を渡した場合に異なる方法で展開CURRENT_USER
されるマクロを持つことです。すべての可能なユーザーをアプリオリに知っているわけではないことに注意してください。最も基本的なケース:
#define IS_CURRENT_USER(user) \
/* this is not valid preprocessor macro */ \
#if user == CURRENT_USER \
1 \
#else \
0 \
#endif
そのようなマクロを使用すると、ユーザー名に依存する他のすべてのマクロは次の方法で実行できます。
#define SOME_USER_SPECIFIC_MACRO(user) SOME_USER_SPECIFIC_MACRO_SWITCH_1(IS_CURRENT_USER(user))
#define SOME_USER_SPECIFIC_MACRO_SWITCH_1(switch) SOME_USER_SPECIFIC_MACRO_SWITCH_2(switch) // expand switch ...
#define SOME_USER_SPECIFIC_MACRO_SWITCH_2(switch) SOME_USER_SPECIFIC_MACRO_##switch // ... and select specific case
#define SOME_USER_SPECIFIC_MACRO_0 ... // not current user
#define SOME_USER_SPECIFIC_MACRO_1 ... // current user
これは可能ですか?
編集:明確にさせてください。各プログラマーCURRENT_USER
が構成ヘッダーで異なる定義をしているとします。user
引数が一致する場合にのみ、ユーザー固有のマクロを意味のあるものに拡張したいと考えていますCURRENT_USER
。これらのマクロに_pragma
s を含めたいので、ランタイム チェックにすることはできません (以下のいくつかの anwser で提案されているように)。
編集: 繰り返しますが、明確化。コードの一部のセクションの最適化を無効にするマクロがあるとします。
#define TURN_OPTIMISATION_OFF __pragma optimize("", off)
一部のプログラマーは、一度にすべてではなく、コードのさまざまなセクションの最適化をオフにしたいと考えています。私が欲しいのはマクロを持っていることです:
#define TURN_OPTIMISATION_OFF(user) /* magic */
これは、プログラマごとの構成ファイルから取得したマクロuser
に対する引数と一致します。CURRENT_USER
ユーザーが一致する場合、マクロはプラグマに展開されます。そうでない場合は、何もありません。