如何评估嵌套的预处理器宏

时间:2012-10-25 17:57:41

标签: c gcc macros evaluation

假设我想选择某个预处理程序指令的行为,在编译时评估常量字符串的连接和另一个宏的结果。

#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 个答案:

答案 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(因此SCENARIO3替换),因为它的参数都不是令牌粘贴操作符的操作数。接下来,它展开TOKENPASTE_HELPER,它会进行实际的令牌粘贴以生成CASE3。最后,它会扩展CASE3宏以获取text3