とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

__VA_ARGS__ がよく分からない

C99, C++0xで使える__VA_ARGS__がよく分かりません。
次のようなコードをプリプロセッサにかけてみることを考えます。

#define A(...) __VA_ARGS__
#define B(a, ...) a, __VA_ARGS__
A()    // Nothing
A(a)   // a
A(a, b)// a, b
B()    // Warning.
B(a)   // Warning! Why?
B(a, b)// a, b

gccプリプロセスすると B(a) で警告がでます。これはなぜなのでしょうか?
一方,VC++10だと B(a) には警告がでません。いったいどちらが正しいのでしょう?
もし gcc の挙動が正しいとするならば 1〜n 個の引数を受け取る関数型マクロはどうやって作るのでしょう?
追記:
コメントで教えてもらいました。

gccの挙動が正しいです。ただし、警告ではなく、エラーです。
-pedantic-errorsを指定すると、正しくエラーになります。

gcc が正しく VC が間違っているようですね。
また,GCC 拡張を使えば,1〜n 個の引数を扱えるようです。
めもがき:2010年12月12日分

#define B(a, ...) a, ##__VA_ARGS__

標準の範囲でできるとうれしいのですが…。何かいい方法ないかなぁ…。