Stringize __VA_ARGS __(C ++可变参数宏)

时间:2014-07-10 20:50:13

标签: 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__ )

#__VA_ARGS__在gcc上编译得很好但在VStudio上出错了。有可靠的便携式解决方案吗?

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

1 个答案:

答案 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的问题......