5

让我们

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 上会出错。是否有可靠且便携的解决方案?

我想ITEM()在一个 .h 文件中收集 .h 文件,该文件将被多次包含在不同的#definitions 中ITEM

4

1 回答 1

0

GCC 和 Visual Studio 处理可变参数宏的方式不同,因为宏基于编译器预处理器(它们在预处理时扩展)。

不同之处之一是它们如何处理空的可变参数宏。其中一个将允许为空__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了可变参数宏为空的问题......

于 2014-07-11T09:47:23.497 回答