2016-12-28 6 views
0

Microsoft Visual Studio Professional 2015バージョン14.0.25431.01更新3は、code belowをコンパイルするときにエラーが発生します。私のバグのように見えます。VCバグ?コンパイラが__VA_ARGS__を数えられない '引数


ありがとうございます。

#include <iostream> 

#define A(a, b, c, ...) #__VA_ARGS__ 
#define B(...) A(__VA_ARGS__) 

int main() 
{ 
    // warning C4003: not enough actual parameters for macro 'A' 
    // error C2059: syntax error: ';' 
    std::cout << B(1, 2, 3, 4); // should print '4'          
    return 0; 
} 
+1

[MSVCは '__VA_ARGS__'を正しく展開しません](http://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly) – cpplearner

+0

@cpplearnerありがとうございます。 – ZDF

答えて

1

私にもバグのようです。これは、マクロの別の層でそれを回避することが可能です:

#define EXPAND(...) __VA_ARGS__ 
#define A(a, b, c, ...) #__VA_ARGS__ 
#define B(...) EXPAND(EXPAND(A) (__VA_ARGS__)) 

アイデアは最初、EXPAND(A)Aに拡大しますと(__VA_ARGS__)(1, 2, 3, 4)に拡大されることをです。その後、あなたはA (1, 2, 3, 4)と残されています。これは、VC++が強制的に再度展開することを理解するものです。

+0

'#define EXPAND(a)a'と' #define B(...)EXPAND(A(__ VA_ARGS __)) 'は簡単ですね。 – ZDF

+0

@ZDFカンマを含むものを渡す場合は、 'EXPAND'に' ... 'と' __VA_ARGS__'が必要です。 'EXPAND(A(__ VA_ARGS __))'については、最初に 'A(__ VA_ARGS __)'を展開してから、再度展開してください。それが警告を抑制するのに十分であれば、私は別のバグを見つけたと思います。もし*バグが元のコードよりも前に修正されれば、コードは再び壊れます。 – hvd

+0

私は何かを見つけられなかったと思う。 :)マイクロソフトによれば、その行動は正しいものです。 cpplearnerが提供する[link](http://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly)を参照してください。 – ZDF

関連する問題