宏中#符号前面的参数

Swi*_*iss 1 c++ macros stringification c-preprocessor

#define LINK_ENTITY_TO_CLASS(mapClassName,DLLClassName) \
    static CEntityFactory<DLLClassName> mapClassName( #mapClassName );
Run Code Online (Sandbox Code Playgroud)

这是来自Alien Swarm mod for Half-Life 2的一个宏,意在用MSVC编译.

我以前从来没有见过#一个宏之前的参数,我不确定这是一个特定的MSVC还是不常见.这是什么意思?

Jam*_*lis 6

这是标准C和C++的一部分,并不是特定于实现的.该#预处理操作stringizes其参数.它接受由其操作数(在本例中为参数mapClassName)指定的参数传递给宏的任何令牌,并从中获取字符串文字.所以,举一个简单的例子,

#define STRINGIZE(x) # x

STRINGIZE(Hello World)
// gets replaced with
"Hello World"
Run Code Online (Sandbox Code Playgroud)

请注意,参数标记在进行字符串化之前不会被宏替换,因此如果Hello或被World定义为宏,结果仍然是相同的.您需要使用额外的间接级别来替换参数宏(链接的答案讨论了连接运算符##,但同样适用于字符串化运算符.