2

可変引数を取るマクロ TYPELIST があります。のようなものが欲しい

typedef TYPELIST(A
                ,B
                ,C
                ,D
#ifdef BLA_
                ,E
#endif
                ,F)

これは gcc と完全に連携します。ただし、MSVC でコンパイルしようとすると、ifdef と endif がマクロ引数として解析されます。1 つの方法は、マクロ呼び出しを ifdef 内に置くことです。しかし、巨大なリストがあり、定義されたさまざまなマクロに応じてさまざまなクラスを含めたい場合は、面倒です。これが MSVC ではなく gcc で機能する特定の理由はありますか?

4

2 に答える 2

0

マクロ内で #ifdef を使用することは合法ではありません。gccがこれを許可していることに少し驚いています。残念ながら、#ifdef を定義全体に配置する必要があります。

#ifdef BLA_
    typedef TYPELIST(a,b,c,d,e,f)
#else
    typedef TYPELIST(a,b,c,d,f)
#endif
于 2013-10-01T08:40:01.510 に答える
0

標準 (§16.3.4/3) によると、「結果的に完全にマクロ置換された前処理トークン シーケンスは、前処理ディレクティブに似ていても、前処理ディレクティブとして処理されません [...]」。g++ が#ifdef/#endifここを処理する場合、それはコンパイラのエラーです (少なくとも標準への準拠を要求した場合、たとえば で-std=...)。

于 2013-10-01T08:40:23.073 に答える