簡體   English   中英

C++ 可變參數宏到可變參數函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM