具有可变参数的MACRO

MACRO with variable arguments?

本文关键字:MACRO 参数 变参      更新时间:2023-10-16

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

在联机编译器中查看

您正在使用的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)

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