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

250*_*250 23 c++ macros c++11

我有一个shared_ptr对象x,它有get和set方法,如下所示:

x->a_value();
x->set_a_value();
x->b_value();
x->set_b_value();
Run Code Online (Sandbox Code Playgroud)

当我尝试定义宏时:

#define MAC(type) \
  x->set_##type##_value(val);

MAC(a)
Run Code Online (Sandbox Code Playgroud)

它工作正常,但当我这样做:

#define MAC(type) \
  x->##type##_value();

MAC(a)
Run Code Online (Sandbox Code Playgroud)

它给出了以下编译错误: pasting formed '->a', an invalid preprocessing token

Bo *_*son 51

预处理器适用于"令牌" - 喜欢名称和运算符.

##运营商通过粘贴小部分一起创建一个新的令牌.在第一个示例中,set_##type##_value变为set_a_value有效令牌.

在第二个例子->##type##_value将成为->a_value,这是不是一个有效的预处理记号.它应该是两个令牌.

如果你只是建立x->type##_value();它应该工作.你得到的分隔标记x,->,a_value,(,),和;.


Que*_*tin 16

它在锡上的含义:->a不是一个有效的预处理器令牌:它是两个令牌.你不需要粘贴在这里.

#define MAC(type) \
  x->type##_value();
Run Code Online (Sandbox Code Playgroud)

  • "确切地说它在锡上的说法"最初是英国的营销口号(用于清漆/涂料产品).在这种情况下,它只是意味着"问题是错误信息所说的". (12认同)
  • @MaskedMan请先发出一个警告,然后喜欢tvtropes,有些人打算今天工作:) (5认同)
  • @Segfault见[确切地说它在锡上说的](http://tvtropes.org/pmwiki/pmwiki.php/Main/ExactlyWhatItSaysOnTheTin).晚点再谢我. (4认同)