1
#define LINK_ENTITY_TO_CLASS(mapClassName,DLLClassName) \
    static CEntityFactory<DLLClassName> mapClassName( #mapClassName );

これは、Half-Life2用のAlienSwarm modのマクロであり、MSVCでコンパイルすることを目的としています。

マクロでaが前に付いた引数を見たことがあり#ません。これが、MSVC固有のものなのか、それとも珍しいものなのかはわかりません。どういう意味ですか?

4

1 に答える 1

6

これは標準CとC++の両方の一部であり、実装固有ではありません。前#処理演算子は引数を文字列化します。オペランドで指定されたパラメーター(この場合はパラメーターmapClassName)のマクロに渡されたトークンを受け取り、それらから文字列リテラルを作成します。したがって、簡単な例として、

#define STRINGIZE(x) # x

STRINGIZE(Hello World)
// gets replaced with
"Hello World"

引数トークンは、文字列化される前にマクロで置き換えられないHelloため、またはWorldがマクロとして定義されている場合でも、結果は同じであることに注意してください。引数マクロを置き換えるには、追加レベルの間接参照を使用する必要があります(リンクされた回答では、連結演算子について説明していますが、文字列化演算子に##も同様に適用されます。

于 2010-07-24T00:18:17.957 に答える