标记化时强制预处理器评估
Force Preprocessor Evaluation While Tokenizing
有没有办法强制预处理器在标记化之前完全评估符号?
我想要的输入输出示例GFR_SER_##token
,GFR_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)
。这个问题有好的解决方法吗?
您可以使用相同的双展开技术,但您需要记住 ##
是一个二元运算符:
#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
有没有办法强制预处理器在标记化之前完全评估符号?
我想要的输入输出示例GFR_SER_##token
,GFR_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)
。这个问题有好的解决方法吗?
您可以使用相同的双展开技术,但您需要记住 ##
是一个二元运算符:
#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