我正在使用字符串化运算符来转换参数,其中可能包含逗号传递给一个宏字符串。据我所知,有些字符不能字符串 - 特别是逗号(,),因为它用于分隔参数和右括号()),因为它标记了参数的结尾。所以我使用可变宏来将逗号传递给字符串操作符,如下所示:visual C++与gcc/clang不同的行为,而stringify参数包含逗号
#include <stdio.h>
#define TEST 10, 20
#define MAKE_STRING(...) #__VA_ARGS__
#define STRING(x) MAKE_STRING(x)
int main()
{
printf("%s\n", STRING(TEST));
return 0;
}
它工作正常。但是,它发生在没有可变宏的情况下会发生什么,所以我修改宏:#define MAKE_STRING(x) #x
。它编译在Visual C++ 2008/2010,输出10, 20
意外细而GCC /铛给预期的编译错误:
宏 “MAKE_STRING” 经过2个参数,但只需1
所以我的问题:是Visual C++做额外的工作或行为是未定义的?
@AlecTeal也许他的意思是字符串化 – WileTheCoyot
@WileTheCoyot你不能用__VA_ARGS__做--GCC有一个特例 - 保持。 –
@WileTheCoyot不会删除你的答案!你有好东西在里面!你说的是对的! OP要废话! –