宏名称扩展语法

时间:2014-07-24 02:42:57

标签: c++11 macros

我开始尝试使用宏来生成数据结构。唉,我遇到了一个奇怪的障碍。我想写下面的宏:

#define CREATE_STRUCT(NAME) struct ##NAME { }

我试图像这样使用它:

CREATE_STRUCT(test);

但是,它会产生错误,宏扩展显然不起作用。我已经注意到,在我见过的这种宏扩展的每个例子中,都有一个下划线(_)位于##<ARG>令牌之前。例如:

#define CREATE_STRUCT(NAME) struct _##NAME { }

这个有效,但当然它会在新声明的类型的开头抛出一个下划线。

所以,这里有几个问题:

  1. 有没有办法避免要求字符位于##令牌之前?
  2. 有关宏中##令牌的规则是什么?
  3. 提前谢谢!

1 个答案:

答案 0 :(得分:1)

除非您想要将多个令牌合并为一个,否则您不需要令牌粘贴运算符。例如,从Test和This获取TestThis。在你的情况下,你可以这样做:

 #define CREATE_STRUCT(NAME) struct NAME { }

如果您在宏上运行g++ -E file.cc,您会看到预处理器出现structtest { };,这会导致错误。