5

持ってみましょう

class Item{
public:
    Item(int id,const char *name,const char *props=NULL);
};

そして、私は書きたい:

ITEM(1,FIRST);
ITEM(2,SECOND, WithSomeProps);

マクロで

#define ITEM(ID,NAME,...) new Item(ID,NAME, #__VA_ARGS__ )

これ#__VA_ARGS__は gcc ではうまくコンパイルされますが、VStudio ではエラーが発生します。堅牢でポータブルなソリューションはありますか?

ITEM()の異なる #definitions で複数回含まれる .h ファイルにのコレクションが必要ですITEM

4

1 に答える 1

0

GCC と Visual Studio では、Variadic マクロの処理が異なります。これは、マクロがコンパイラ プリプロセッサに基づいているためです (プリプロセス時に展開されます)。

違いの 1 つは、空の可変個引数マクロの処理方法です。そのうちの 1 つは空__VA_ARGS__を許可し、もう 1 つは空の場合にコンパイラ エラーを引き起こし__VA_ARGS__ます。

あなたの例では、最初の行ITEM(1,FIRST)はコンパイル時にエラーを引き起こしますが、他の行では問題なく動作します。

これに対する 1 つの回避策は、最初の引数を空にすることです。そのため、コンストラクターは次のようになります。

Item(int id,const char *name,void *allwaysNull, const char *props=NULL);

そして、このようなマクロの初期化を行います

ITEM(1,0,FIRST)
ITEM(2,0,SECOND,WithSomeProps)

奇妙なのは、私の経験から、VA_ARGS可変長マクロの空で問題が発生していたのは GCC だったということです...

于 2014-07-11T09:47:23.497 に答える