标记时强制预处理器评估

时间:2015-05-28 23:53:40

标签: c++ boost metaprogramming

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

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

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

对于粘贴字符串,只需添加一个间接级别就可以了:

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

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

我尝试使用BOOST_PP_IDENTIFY(s)来解析输入,但遗憾的是导致 Boost调用的标记化,例如GFR_SER_BOOST_PP_IDENTIFY(s)。这个问题是否有很好的解决方法?

1 个答案:

答案 0 :(得分:2)

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

#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