以下代码在visual studio 2013中。
template<typename T1, typename T2 = int>
int TestFucntion(T1 value1, T2 value2 = T2())
{
return 1;
}
#define LOG_FATAL( format, ...) TestFucntion(format, __VA_ARGS__, 1)
#define LOG_FATA2_INNER(format, ...) TestFucntion(format, __VA_ARGS__)
#define LOG_FATA2(format, ...) LOG_FATA2_INNER(format, __VA_ARGS__, 1)
int _tmain(int argc, _TCHAR* argv[])
{
LOG_FATAL(L"abc"); // compile ok
LOG_FATA2(L"abc"); // error C2059: syntax error : ','
}
有没有办法删除LOG_FATA2(L“abc”)中的编译错误?
答案 0 :(得分:2)
您正在使用的Visual C ++扩展,其中可以省略必需的宏参数,并且如果没有传递宏参数,, __VA_ARGS__
将扩展为空,这不是完全万无一失的。在您的示例中,您已设法创建一个程序,其中预处理器未意识到应删除,
。无论如何,你不需要这个扩展。您可以轻松地重新编写代码,以便它可以与任何编译器一起使用。
#define LOG_FATAL(...) TestFunction(__VA_ARGS__, 1)
#define LOG_FATA2_INNER(...) TestFunction(__VA_ARGS__)
#define LOG_FATA2(...) LOG_FATA2_INNER(__VA_ARGS__, 1)
格式字符串在这里只是变量参数之一。