繁体   English   中英

C ++宏'##'在' - >'运算符后不起作用

[英]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连接而形成的,因为typea ,连接的结果是->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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM