我有一个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
答案 0 :(得分:51)
预处理器适用于"令牌" - 喜欢名字和经营者。
##
运算符通过将较小的部分粘贴在一起来创建新标记。在第一个示例中,set_##type##_value
变为set_a_value
,这是一个有效的令牌。
在第二个示例中,->##type##_value
将变为->a_value
,这是不有效的预处理程序令牌。它应该是两个令牌。
如果你只是行x->type##_value();
它应该工作。您会获得单独的令牌x
,->
,a_value
,(
,)
和;
。
答案 1 :(得分:16)
它在锡上的内容:->a
不是一个有效的预处理器令牌:它是两个令牌。你不需要粘贴在这里。
#define MAC(type) \
x->type##_value();
答案 2 :(得分:1)
令牌粘贴操作符(##
)用于将两个令牌连接成一个有效令牌。
写作时
x->##type##_value();
第一个处理过的令牌是x
。
下一个令牌是通过将令牌->
与type
连接而形成的,因为type
是a
,连接的结果是{{1} },这应该是一个有效的令牌,但不是。
因此,您收到错误:->a
。
要解决此问题,请写下
pasting formed '->a', an invalid preprocessing token
这样
解析的第一个令牌是x->type##_value();
。
解析的下一个令牌是x
。
下一个标记是通过将标记->
(变为type
)与标记a
连接而形成的。这会提供_value
,这是一个有效的令牌。
下一个标记为a_value
。
下一个标记为(
。
最后一个标记是)
。