【问题标题】:Argument Preceded by a # Token in a Macro宏中以 # 标记开头的参数
【发布时间】:2023-11-15 18:08:01
【问题描述】:
#define LINK_ENTITY_TO_CLASS(mapClassName,DLLClassName) \
    static CEntityFactory<DLLClassName> mapClassName( #mapClassName );

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

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

【问题讨论】:

    标签: c++ macros c-preprocessor stringification


    【解决方案1】:

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

    #define STRINGIZE(x) # x
    
    STRINGIZE(Hello World)
    // gets replaced with
    "Hello World"
    

    请注意,参数标记在字符串化之前不会被宏替换,因此如果将HelloWorld 定义为宏,则结果仍然相同。您需要 use an extra level of indirection 来替换参数宏(链接的答案讨论了连接运算符 ##,但同样适用于字符串化运算符。

    【讨论】:

    • 你的回答是对的,但我只是想澄清这是 C 预处理器的标准部分,而不是 MSVC 特定的东西。
    • @Swiss:对不起;是的:这是 C 语言标准的一部分。
    最近更新 更多