2017-03-08 20 views
-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にマクロの可変長引数を渡すにエラーがありますように思えるが、私は見つけることができません理由またはこれを修正する方法。クラン上どうやら

+1

'## __ VA_ARGS__'は標準ではありません。それが移植可能であるとは思わないでください。また、 'LOG'に対してバリデーショナルなテンプレートにマクロを使用する特別な理由はないようです。 – chris

+1

あなた自身に好意を持ってバリデーションテンプレートについて学んでください –

+0

私はバリデーショナルテンプレートについて知っています。とにかく、私はコード内の多くの点でマクロを使用し、それらを変更したくないので、これを解決する方法を見つけました。 – zeb

答えて

0

私は##__VA_ARGS__だけではなく__VA_ARGS__を使用していた私の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__); } } 

などのお知らせを変更する必要があります。

それだけでなく、MSVCとクランの両方でコンパイルされます。