マクロの#トークンが先行した引数
-
28-09-2020 - |
質問
#define LINK_ENTITY_TO_CLASS(mapClassName,DLLClassName) \
static CEntityFactory<DLLClassName> mapClassName( #mapClassName );
.
これは、MSVCでコンパイルされることを意味している、半減期のエイリアン群MODからのマクロです。
前のマクロの#
が前に引数を見たことがない、そして私はこれがMSVC固有のものか単なる珍しいかどうかはかなりわからない。それはどういう意味ですか?
解決
これは標準CとC ++の両方の一部であり、実装固有ではありません。#
前処理演算子はその引数を描いています。オペランドによって指定されたパラメータ(この場合はパラメータmapClassName
)のマクロに渡され、文字列がそれらからリテラルになります。そのため、簡単な例では、
#define STRINGIZE(x) # x
STRINGIZE(Hello World)
// gets replaced with
"Hello World"
.
引数トークンはではなく、rinsizedが置き換えられる前に置き換えられているので、Hello
またはWorld
がマクロとして定義されている場合、結果は同じになります。追加レベルのIDIRECTION を使用して、引数マクロが交換されます(リンクされた答えは連結演算子、##
について説明しますが、rsypization演算子に等しく適用されます。
所属していません StackOverflow