在MS文件apiset.h中,有以下预处理程序指令:
#define API_SET_BY_ORDINAL(X,O,PO) X @##O NONAME
MS help page识别字符串化,字符化和令牌粘贴预处理器命令。 '@'不是96 accepted characters之一,在MSVC中,'##'之前的'@'不能包含在标识符中。
整个'@ ##'是预处理程序命令吗?如果是这样,其目的是什么?如果没有,应该如何理解上面的宏?
最佳答案
Microsoft C / C ++编译器从未要求##预处理运算符的结果为有效的预处理令牌。 @##O
的目的是将@
字符粘贴在O
给出的数字前面,中间没有空格。因此,API_SET_BY_ORDINAL(GetSystemTime, 633, x)
将扩展为GetSystemTime @633 NONAME
。此宏不是要在C / C ++代码中使用,而是要在模块定义(.DEF)文件中用作EXPORT statement的一部分。
尽管此宏是新的,但很长一段时间以来,其他未生成有效预处理令牌的##示例已出现在Microsoft的标头中。例如,我可以从2000年7月发布的Platform SDK标头(我手头最旧的版本)的标头中找到以下行:
#define _VARIANT_BOOL /##/
请注意,
//
不是有效的预处理令牌。由于没有//
运算符,因此它是两个单独的预处理令牌。关于c++ - 未记录的C++预处理程序指令(MSVC 2013u4),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58164085/