令牌化时强制预处理器评估

Force Preprocessor Evaluation While Tokenizing

本文关键字:预处理 处理器 评估 令牌      更新时间:2023-10-16

是否有一种方法可以强制预处理器在标记之前完全评估符号?

输入输出的例子我想要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),它解决了输入,但不幸的是导致的标记化 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