C++11 宏名称扩展语法

C++11 宏名称扩展语法,c++11,macros,C++11,Macros,我开始尝试使用宏生成数据结构。唉,我遇到了一个奇怪的障碍。我想编写以下宏: #define CREATE_STRUCT(NAME) struct ##NAME { } 我尝试这样使用它: CREATE_STRUCT(test); 但是,它会生成一个错误,宏扩展显然不起作用。我注意到,在我所看到的每一个此类宏扩展示例中,标记前面都有一个下划线()。例如: #define CREATE_STRUCT(NAME) struct _##NAME { } 这一个可以工作,但它当然会在新声明的类型的开

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

#define CREATE_STRUCT(NAME) struct ##NAME { }
我尝试这样使用它:

CREATE_STRUCT(test);
但是,它会生成一个错误,宏扩展显然不起作用。我注意到,在我所看到的每一个此类宏扩展示例中,
标记前面都有一个下划线(
)。例如:

#define CREATE_STRUCT(NAME) struct _##NAME { }
这一个可以工作,但它当然会在新声明的类型的开头抛出一个下划线

所以,这里有几个问题:

  • 有没有办法避免在
    ##
    标记前面加字符
  • 关于宏中的
    #
    标记,有哪些规则

  • 提前谢谢你

    除非要将多个令牌合并为一个令牌,否则不需要令牌粘贴操作符。例如,从Test和This中获取TestThis。在您的情况下,您只需执行以下操作:

     #define CREATE_STRUCT(NAME) struct NAME { }
    

    如果您在宏上运行
    g++-E file.cc
    ,您将看到预处理器提供了
    structtest{}这会导致一个错误。

    我不知道您为什么要用###作为示例。#用于将两个符号连接在一起。请尝试
    #定义创建结构(名称)结构名称{}