假设我想选择某个预处理程序指令的行为,在编译时评估常量字符串的连接和另一个宏的结果。
#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 **/
我很难想到一个可行的解决方案,因为预处理器是一次通过的野兽。这甚至可行吗?
答案 0 :(得分: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
时,它扩展了它的arugments(因此SCENARIO
被3
替换),因为它的参数都不是令牌粘贴操作符的操作数。接下来,它展开TOKENPASTE_HELPER
,它会进行实际的令牌粘贴以生成CASE3
。最后,它会扩展CASE3
宏以获取text3
。