【问题标题】:Force Preprocessor Evaluation While Tokenizing标记化时强制预处理器评估
【发布时间】:2015-05-28 23:53:40
【问题描述】:

有没有办法强制预处理器在标记化之前完全评估符号?

我想要GFR_SER_##tokenGFR_SER_INT的输入输出示例。

例如,我正在尝试使用 Boost::PP 进行一些预处理器元编程。

对于粘贴字符串,这相当容易,因为您只需添加一个间接级别,例如:

#define str(s) xstr(s)
#define xstr(s) #s

但是,这不适用于标记化,因为 #define xtkz(t) ##t 是非法的,因为表达式开头的标记语法。

我尝试使用 BOOST_PP_IDENTIFY(s),它解析输入,但不幸的是导致 that Boost 调用的标记化,例如 GFR_SER_BOOST_PP_IDENTIFY(s)。这个问题有没有好的解决方法?

【问题讨论】:

    标签: c++ boost metaprogramming


    【解决方案1】:

    您可以使用相同的双扩展技术,但您需要记住 ## 是二元运算符:

    #define XCONCAT(a,b) a##b
    #define CONCAT(a,b) XCONCAT(a,b)
    
    #define token INT
    CONCAT(GFR_SER_,token)
    

    通过gcc -E 运行上述结果:

    # 1 "<stdin>"
    # 1 "<command-line>"
    # 1 "/usr/include/stdc-predef.h" 1 3 4
    # 30 "/usr/include/stdc-predef.h" 3 4
    # 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4
    # 31 "/usr/include/stdc-predef.h" 2 3 4
    # 1 "<command-line>" 2
    # 1 "<stdin>"
    
    
    
    
    GFR_SER_INT
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2016-08-21
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      相关资源
      最近更新 更多