7

Visual Studio 2005 では、次のようなマクロがあります (例示!!):

#define MY_CALL(FUN, ...) \
  if(prepare(x, y)) {     \
    FUN(__VA_ARGS__);     \
  }
/**/

関数が少なくとも 1 つの引数を取る限り、問題ありません。

関数が引数を取らない場合、プリプロセッサは「役立つように」「末尾のコンマ」を削除し、次のように展開します。

if(prepare(x y)) { funct(); }

いいですね。

__VA_ARGS__Visual C++ (VS 2005)でゼロで動作するように、このマクロを修正するにはどうすればよいですか?


どうやらこれは VS2005 のバグです

4

1 に答える 1

6

残念ながら、私はもう Visual C++ を使用していません (そのため、これが機能することを確認できません) が、これを試してもらえますか?

#define MY_CALL(FUN, ...) \
  if(prepare(x, y)) {     \
    int fail[] = {0,}     \
    FUN(__VA_ARGS__);     \
  }

gcc 4.2 を使用すると、そのコンテキストで{0,}との両方{0}が許可されるため、コンマが削除されても削除されなくても問題ありません。ただし、それが仕様で一般的に受け入れられているのか、一般的に実装されている拡張機能なのか、gcc に固有のものなのかはわかりません。

{0,}構文Visual C ++で許可されている場合、これで問題が解決することが期待されます(構文のどこに表示されているかに関係なく、直前のコンマ__VA_ARGS__が誤って削除されていることを正しく理解していると仮定します)。

于 2011-08-18T07:44:27.257 に答える