C ++宏' ##'在' - >'之后不起作用操作者

时间:2018-04-20 08:55:42

标签: c++ c++11 macros

我有一个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

3 个答案:

答案 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连接而形成的,因为typea,连接的结果是{{1} },这应该是一个有效的令牌,但不是。

因此,您收到错误:->a

要解决此问题,请写下

pasting formed '->a', an invalid preprocessing token

这样

  • 解析的第一个令牌是x->type##_value();

  • 解析的下一个令牌是x

  • 下一个标记是通过将标记->(变为type)与标记a连接而形成的。这会提供_value,这是一个有效的令牌。

  • 下一个标记为a_value

  • 下一个标记为(

  • 最后一个标记是)