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。
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可变宏的问题......