我们有
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__ )
#__VA_ARGS__
在gcc上编译得很好但在VStudio上出错了。有可靠的便携式解决方案吗?
我希望在.h文件中有一个ITEM()
的集合,该集合将多次包含在ITEM
的不同#definition中。
答案 0 :(得分:0)
GCC和Visual Studio以不同的方式处理Variadic宏,因为宏基于编译器预处理器(它们在预处理时扩展)。
其中一个不同之处在于它们如何处理空的可变参数宏。
其中一个将允许空__VA_ARGS__
,而另一个将导致编译器错误,如果__VA_ARGS__
为空。
在您的示例中,第一行ITEM(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
的问题......