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,将实际的令牌粘贴到 make CASE3。最后,它扩展CASE3宏以获得text3.

于 2012-10-25T18:04:54.643 回答