未记录的C++预处理器指令 (MSVC 2013u4)

Undocumented C++ preprocessor directives (MSVC 2013u4)

本文关键字:MSVC 2013u4 指令 处理器 记录 C++ 预处理      更新时间:2023-10-16

在MS文件apiset.h中,有以下预处理器指令:

#define API_SET_BY_ORDINAL(X,O,PO)         X @##O NONAME

MS 帮助页面可识别字符串化、字符化和令牌粘贴预处理器命令。"@"不是 96 个接受字符之一,在 MSVC 中,"##"前面的"@"不能位于标识符中。

整个"@##"是预处理器命令吗?如果是这样,它的目的是什么?如果不是,应该如何理解上述宏?

Microsoft C/C++ 编译器从不要求 ## 预处理运算符的结果是有效的预处理标记。@##O 的目的是将@字符粘贴到O给出的数字前面,中间没有任何空格。所以API_SET_BY_ORDINAL(GetSystemTime, 633, x)将扩展到GetSystemTime @633 NONAME.此宏不应在 C/C++ 代码中使用,而是用作模块定义 (.DEF) 文件。

虽然此宏是新的,但 ## 的其他未生成有效预处理令牌的示例已在 Microsoft 的标头中存在很长时间。例如,我可以在 2000 年 7 月发布的 Platform SDK 标头(我手头的旧版本)的标头中找到以下行:

#define _VARIANT_BOOL /##/

请注意,//不是有效的预处理令牌。由于他们不是//运算符,因此它是两个单独的预处理令牌。