【问题标题】:How to evaluate a nested preprocessor macro如何评估嵌套的预处理器宏
【发布时间】:2012-10-25 17:57:41
【问题描述】:

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

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

我很难想出一个可行的解决方案,因为预处理器是一次性的野兽。这甚至可行吗?

【问题讨论】:

    标签: c gcc macros evaluation


    【解决方案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 时,它扩展了它的参数(所以SCENARIO3 替换),因为它的两个参数都不是标记粘贴运算符的操作数。接下来,它扩展TOKENPASTE_HELPER,它执行实际的令牌粘贴以生成CASE3。最后,它扩展CASE3 宏得到text3

    【讨论】:

    • 是的,双重间接 FTW。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2012-06-29
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多