我开始尝试使用宏来生成数据结构。唉,我遇到了一个奇怪的障碍。我想写下面的宏:
#define CREATE_STRUCT(NAME) struct ##NAME { }
我试图像这样使用它:
CREATE_STRUCT(test);
但是,它会产生错误,宏扩展显然不起作用。我已经注意到,在我见过的这种宏扩展的每个例子中,都有一个下划线(_
)位于##<ARG>
令牌之前。例如:
#define CREATE_STRUCT(NAME) struct _##NAME { }
这个有效,但当然它会在新声明的类型的开头抛出一个下划线。
所以,这里有几个问题:
##
令牌之前?##
令牌的规则是什么?提前谢谢!
答案 0 :(得分:1)
除非您想要将多个令牌合并为一个,否则您不需要令牌粘贴运算符。例如,从Test和This获取TestThis。在你的情况下,你可以这样做:
#define CREATE_STRUCT(NAME) struct NAME { }
如果您在宏上运行g++ -E file.cc
,您会看到预处理器出现structtest { };
,这会导致错误。