实现一个断言宏我偶然发现了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
时出错,但我无法找出原因或如何解决这个问题。
答案 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一起编译。