2015-05-28 30 views
1

有没有办法在标记之前强制预处理器完全评估符号?Force Preprocessor Evaluation 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),它解决了输入试过,但不幸的是导致升压呼叫如GFR_SER_BOOST_PP_IDENTIFY(s)的标记化。这个问题有没有很好的解决方法?

回答

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