在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/

10-13 04:54