C++ 字符串化变量(C+;+;可变宏)

C++ 字符串化变量(C+;+;可变宏),c++,c-preprocessor,stringification,variadic-macros,C++,C Preprocessor,Stringification,Variadic Macros,让我们吃点东西吧 class Item{ public: Item(int id,const char *name,const char *props=NULL); }; 我想写: ITEM(1,FIRST); ITEM(2,SECOND, WithSomeProps); 用宏 #define ITEM(ID,NAME,...) new Item(ID,NAME, #__VA_ARGS__ ) 在gcc上编译得很好,但在VStudio上出现了一个错误。是否有可靠的便携式解决方案 我

让我们吃点东西吧

class Item{
public:
    Item(int id,const char *name,const char *props=NULL);
};
我想写:

ITEM(1,FIRST);
ITEM(2,SECOND, WithSomeProps);
用宏

#define ITEM(ID,NAME,...) new Item(ID,NAME, #__VA_ARGS__ )
在gcc上编译得很好,但在VStudio上出现了一个错误。是否有可靠的便携式解决方案


我希望在.h文件中有一个
ITEM()
集合,该集合将多次包含在
ITEM

区别之一是它们如何处理空的可变宏。 其中一个将允许空的
\uuuu VA\u ARGS\uu
,而如果
\uu VA\u ARGS\uu
为空,另一个将导致编译器错误

在您的示例中,第一行
项(1,first)
将在编译时导致错误,而在另一行上正常工作

解决方法之一是第一个参数为空,因此您的构造函数类似于:

Item(int id,const char *name,void *allwaysNull, const char *props=NULL);
然后用这样的宏初始化

ITEM(1,0,FIRST)
ITEM(2,0,SECOND,WithSomeProps)

奇怪的是,根据我的经验,GCC在变量宏的空
VA_ARGS
方面遇到了问题

为什么只需键入
新项目(ID、名称、其他参数)
?为什么需要这个?由于构造函数的第三个输入参数是默认的,因此您可以调用
项(1,第一)
项(2,第二,WithSomeProps)
。为什么在宏后面隐藏了wild
new
,我发现将
\uu VA_ARGS\uuu
伪参数字符串化是否是标准的CPP很有趣。实际使用有点复杂,我想用一个简单的例子来说明我想要实现的目标,并澄清其可能性。VA_AGS是一个错误类型吗?嗨@MIchaelCMS我还没有尝试过,但你的ida似乎可以解决这个问题缺少emtpy参数,但我看不到这如何有助于将VA_参数字符串化