C ++可变参数宏到可变参数函数

时间:2017-03-08 16:36:49

标签: c++ macros variadic-functions

实现一个断言宏我偶然发现了Xcode clang上的一个问题。

我使用以下代码:

void Log(LogLevel logLevel, const std::string& message);

std::string FormatString(const char* format, ...);

#define LOG(Level, Format, ...)                                     \
{                                                                   \
    std::string _ac_err_str_ = FormatString(Format, ##__VA_ARGS__); \
    Log(Level, _ac_err_str_);                                       \
}

#define checkf(expr, Format, ...)   { if(!(expr)) { LOG(LL_ErrorMessage, TXT("Log in file ") __FILE__ TXT(" at line %d: ") TXT(#expr) TXT(". ") Format, __LINE__, __VA_ARGS__); } }

使用MSVC一切正常但在Clang上我收到以下错误:Expected expression

我已经在这条线上找到了问题:

std::string _ac_err_str_ = FormatString(Format, ##__VA_ARGS__);

更具体地说,问题出在##__VA_ARGS__部分,因为如果删除它,一切都会编译。

另外,如果我将第三个参数传递给它编译的宏,例如:

checkf(false, "Error message");       // Won't compile
checkf(false, "Error %s", "message"); // Will compile

似乎将宏的可变参数传递给FormatString时出错,但我无法找出原因或如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

显然对于Clang我需要像这样更改我的checkf

#define checkf(expr, Format, ...)   { if(!(expr)) { LOG(LL_ErrorMessage, TXT("Log in file ") __FILE__ TXT(" at line %d: ") TXT(#expr) TXT(". ") Format, __LINE__, ##__VA_ARGS__); } }

请注意,我使用的是##__VA_ARGS__,而不仅仅是__VA_ARGS__

它也与MSVC和Clang一起编译。