6

コンパイル時に定数文字列と別のマクロの結果の連結を評価する特定のプリプロセッサディレクティブの動作を選択するとします。

#define CASE1 text1
#define CASE2 text2
#define CASE3 text3
#define SCENARIO 3
/** the following won't work - for examplification purposes only**/
#define FUNCTION CASE##SCENARIO

/** whenever I write FUNCTION, I expect to see text3 **/

プリプロセッサはワンパスの獣であるため、実行可能なソリューションを考えるのに苦労しています。それも実現可能ですか?

4

1 に答える 1

14

可能ですが、マクロのレイヤーを追加するだけで済みます。重要なのは、トークン貼り付け演算子を使用する場合##、プリプロセッサはそのオペランドを展開しないということです。ただし、マクロの別のレイヤーを追加すると、プリプロセッサーはそれらの引数を拡張します。例えば:

#define CASE1 text1
#define CASE2 text2
#define CASE3 text3
#define SCENARIO 3

#define TOKENPASTE_HELPER(x, y) x ## y
#define TOKENPASTE(x, y) TOKENPASTE_HELPER(x, y)
#define FUNCTION TOKENPASTE(CASE, SCENARIO)

プリプロセッサが拡張するFUNCTIONと、拡張しTOKENPASTEます。展開すると、引数のどちらもトークン貼り付け演算子のオペランドではないため、引数が展開されますTOKENPASTE(したがって、SCENARIOに置き換えられます)。3次に、を展開TOKENPASTE_HELPERし、実際のトークンの貼り付けを行ってを作成しCASE3ます。最後に、CASE3マクロを展開してを取得しますtext3

于 2012-10-25T18:04:54.643 に答える