Как оценить вложенный макрос препроцессора

позволять'скажем, я хочу выбрать поведение определенной директивы препроцессора, оценивающей во время компиляции конкатенацию константной строки и результат другого макроса.

#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 **/

Мне трудно думать о жизнеспособном решении, поскольку препроцессор - зверь за один проход. Это вообще возможно?

Ответы на вопрос(1)

Решение Вопроса

Возможно, вам просто нужно добавить несколько дополнительных слоев макросов. Ключ в том, что при использовании оператора вставки токена##препроцессор не будет расширять свои операнды. Но если вы добавите еще один слой макросов, препроцессор расширит эти аргументы. Например:

#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

 ziu25 окт. 2012 г., 20:20
да, двойной уровень косвенности FTW. Спасибо.

Ваш ответ на вопрос