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)
。为什么在宏后面隐藏了wildnew
,我发现将\uu VA_ARGS\uuu
伪参数字符串化是否是标准的CPP很有趣。实际使用有点复杂,我想用一个简单的例子来说明我想要实现的目标,并澄清其可能性。VA_AGS是一个错误类型吗?嗨@MIchaelCMS我还没有尝试过,但你的ida似乎可以解决这个问题缺少emtpy参数,但我看不到这如何有助于将VA_参数字符串化