MACRO有可变参数吗?

时间:2014-09-07 13:45:39

标签: c++ visual-c++ macros

以下代码在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”)中的编译错误?

See it in online compiler

1 个答案:

答案 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)

格式字符串在这里只是变量参数之一。