未记录的C++预处理器指令 (MSVC 2013u4)
Undocumented C++ preprocessor directives (MSVC 2013u4)
在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 /##/
请注意,//
不是有效的预处理令牌。由于他们不是//
运算符,因此它是两个单独的预处理令牌。
相关文章:
- MSVC多行宏编译器错误
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- MSVC是否支持C++11样式的属性而不是__declspec
- MSVC将仅移动结构参数解释为指针
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 有与__builtin__FUNCTION()等效的MSVC吗
- 为什么 gcc 编译这个而 msvc 没有
- 看起来is_nothrow_constructible_v()在MSVC中被破坏了,我错了吗
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- MSVC 忽略 [[maybe_unused]] 的功能?
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- MSVC中的宏观扩展问题
- "Ill-defined for-loop - loop executes infinitely" (MSVC C6295)
- __CHAR_BIT__宏是否为 MSVC 编译器预定义?
- 不正确的操作数类型 MSVC
- 使用 MSVC 调试类型
- CRTP 中的复制赋值运算符 - gcc vs clang 和 msvc
- MSVC(Visual C++)是否有等效的-weffc ++?
- 命名空间范围内的外部 - GCC vs clang vs msvc
- 未记录的C++预处理器指令 (MSVC 2013u4)