字符串化 __VA_ARGS__(C++ 可变参数宏)

tru*_*ru7 5 c++ stringification c-preprocessor variadic-macros

让我们

class Item{
public:
    Item(int id,const char *name,const char *props=NULL);
};
Run Code Online (Sandbox Code Playgroud)

我想写:

ITEM(1,FIRST);
ITEM(2,SECOND, WithSomeProps);
Run Code Online (Sandbox Code Playgroud)

用宏

#define ITEM(ID,NAME,...) new Item(ID,NAME, #__VA_ARGS__ )
Run Code Online (Sandbox Code Playgroud)

#__VA_ARGS__在 gcc 上编译得很好,但在 VStudio 上会出错。是否有可靠且便携的解决方案?

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

Mic*_*CMS 0

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

区别之一是它们如何处理空可变参数宏。其中一个允许为空__VA_ARGS__,而另一个如果__VA_ARGS__为空则将导致编译器错误。

在您的示例中,第一行将ITEM(1,FIRST)在编译时导致错误,而在另一行上工作正常。

解决此问题的一个解决方法是使用空的第一个参数,因此您的构造函数将类似于:

Item(int id,const char *name,void *allwaysNull, const char *props=NULL);
Run Code Online (Sandbox Code Playgroud)

然后像这样进行宏初始化

ITEM(1,0,FIRST)
ITEM(2,0,SECOND,WithSomeProps)
Run Code Online (Sandbox Code Playgroud)

奇怪的是,根据我的经验,GCC 遇到了空VA_ARGS可变宏的问题......