我正在使用字符串化运算符将可能包含传递给宏的逗号的参数转换为字符串。据我所知,有些字符不能被字符串化——特别是逗号(,),因为它用于分隔参数和右括号()),因为它标志着参数的结束。所以我使用可变参数宏将逗号传递给字符串化运算符,如下所示:
#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/clang 按预期给出编译错误时输出:
宏“MAKE_STRING”传递了 2 个参数,但只需要 1 个
所以我的问题是:Visual c++ 是在做额外的工作还是行为未定义?