[英]C++ variadic macro to variadic function
實現斷言宏我在 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
出錯,但我找不到原因或如何解決此問題。
顯然在 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 進行編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.