[英]C++ macro '##' doesn't work after '->' operator
我有一个shared_ptr对象x,它有get和set方法,如下所示:
x->a_value();
x->set_a_value();
x->b_value();
x->set_b_value();
当我尝试定义宏时:
#define MAC(type) \
x->set_##type##_value(val);
MAC(a)
它工作正常,但当我这样做:
#define MAC(type) \
x->##type##_value();
MAC(a)
它给出了以下编译错误: pasting formed '->a', an invalid preprocessing token
预处理器适用于“令牌” - 喜欢名称和运算符。
##
运算符通过将较小的部分粘贴在一起来创建新标记。 在第一个示例中, set_##type##_value
变为set_a_value
,这是一个有效的标记。
在第二个示例中->##type##_value
将变为->a_value
,它不是有效的预处理程序标记。 它应该是两个令牌。
如果你只是行x->type##_value();
它应该工作。 你得到单独的标记x
, ->
, a_value
, (
, )
和;
。
它在锡上的内容: ->a
不是一个有效的预处理器令牌:它是两个令牌。 你不需要粘贴在这里。
#define MAC(type) \
x->type##_value();
令牌粘贴操作符( ##
)用于将两个令牌连接成一个有效令牌。
当你写作
x->##type##_value();
第一个处理的令牌是x
。
下一个标记是通过将标记->
与type
连接而形成的,因为type
是a
,连接的结果是->a
,它应该是有效的标记,但不是。
因此,您会收到错误: pasting formed '->a', an invalid preprocessing token
。
要解决这个问题,请写一下
x->type##_value();
这条路
解析的第一个令牌是x
。
解析的下一个标记是->
。
下一个标记是通过将令牌type
(变为a
)与令牌_value
连接而形成的。 这给出了a_value
,它是一个有效的标记。
下一个标记是(
。
下一个标记是)
。
最后一个标记是;
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.