Stringize __VA_ARGS__ (C++ variadic macros)

Stringize __VA_ARGS__ (C++ variadic macros)

本文关键字:variadic macros C++ VA ARGS Stringize      更新时间:2023-10-16

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的不同#定义

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上有问题…