Hec*_*tor 1 c++ c-preprocessor
在MS文件apiset.h中,有以下预处理程序指令:
#define API_SET_BY_ORDINAL(X,O,PO) X @##O NONAME
Run Code Online (Sandbox Code Playgroud)
MS 帮助页面可识别字符串化,字符化和令牌粘贴预处理器命令。'@'不是96个可接受的字符之一,在MSVC中,'##'之前的'@'不能在标识符中。
整个'@ ##'是预处理程序命令吗?如果是这样,其目的是什么?如果没有,应该如何理解上面的宏?
Microsoft C / C ++编译器从未要求##预处理运算符的结果为有效的预处理令牌。的目的@##O是将一个@字符粘贴到所给定的数字前面,O中间没有任何空格。因此API_SET_BY_ORDINAL(GetSystemTime, 633, x)将扩展为GetSystemTime @633 NONAME。此宏并不是要在C / C ++代码中使用,而是要用作模块定义(.DEF)文件中EXPORT语句的一部分。
尽管此宏是新的,但很长一段时间以来,其他未生成有效预处理令牌的##示例都已出现在Microsoft的标头中。例如,我可以从2000年7月发布的Platform SDK标头(我手头最旧的版本)的标头中找到以下行:
#define _VARIANT_BOOL /##/
Run Code Online (Sandbox Code Playgroud)
请注意,这//不是有效的预处理令牌。由于没有//运算符,因此它是两个单独的预处理令牌。
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |