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

这是半条命 2 的 Alien Swarm 模组中的一个宏,旨在使用 MSVC 编译。

我以前从未在宏中看到以 a 开头的参数#,而且我不确定这是特定于 MSVC 的事情还是不常见。这是什么意思?

4

1 回答 1

6

这是标准 C 和 C++ 的一部分,不是特定于实现的。#预处理运算符将其参数字符串化。它获取传递给宏的任何标记,用于由其操作数指定的参数(在本例中为 parameter mapClassName),并从中生成字符串文字。所以,举个简单的例子,

#define STRINGIZE(x) # x

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

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

于 2010-07-24T00:18:17.957 回答