-1
私はXcodeの打ち鳴らすに問題につまずいたアサーションマクロを実装します。C++可変引数関数の可変引数マクロ
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で正常に動作しますが、クランに、私は次のエラーを取得する:
は、私は次のコードを使用し
:私は、この行に問題を突き止めました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
にマクロの可変長引数を渡すにエラーがありますように思えるが、私は見つけることができません理由またはこれを修正する方法。クラン上どうやら
'## __ VA_ARGS__'は標準ではありません。それが移植可能であるとは思わないでください。また、 'LOG'に対してバリデーショナルなテンプレートにマクロを使用する特別な理由はないようです。 – chris
あなた自身に好意を持ってバリデーションテンプレートについて学んでください –
私はバリデーショナルテンプレートについて知っています。とにかく、私はコード内の多くの点でマクロを使用し、それらを変更したくないので、これを解決する方法を見つけました。 – zeb