MSVC中的宏观扩展问题

Macro expansion problems in MSVC

本文关键字:扩展 问题 宏观 MSVC      更新时间:2023-10-16

我想知道为什么这个宏会扩展得如此之大。

#define CONCAT_IMPL(A, B) A##B
#define CONCAT(A, B) CONCAT_IMPL(A, B)
#define EAT(...)
#define TEST(ARG) EXPANDED, ARG) EAT(
#define GET_LAST(A, B) B
int result = 0;
result = GET_LAST(CONCAT(TEST, (1)), 2); // result is 2
result = GET_LAST(TEST(1), 2); // result is 2
result = GET_LAST(EXPANDED, 1) EAT(, 2); // result is 1

我想要GET_LAST(CONCAT(TEST, (1((, 2(; 评估值 1。

如果您能告诉我在 MSVC 上是否有可能或是否缺少某些内容,我将不胜感激。

C11 草稿:

由最外面匹配的括号限定的预处理标记序列构成了类似函数的宏的参数列表。列表中的各个参数由逗号预处理标记分隔,但匹配内括号之间的逗号预处理标记不会分隔参数。

GET_LAST(CONCAT(TEST, (1)), 2)是使用两个参数的列表对宏GET_LAST的调用。一个是CONCAT(TEST, (1)),另一个是2.

确定调用类似函数的宏的参数后,将进行参数替换。替换列表中的参数,除非前面有 # 或 ## 预处理标记或后跟 ## 预处理标记(见下文(,否则在扩展其中包含的所有宏后,将替换为相应的参数。在替换之前,每个参数的预处理标记都被完全宏替换,就好像它们构成了预处理文件的其余部分一样;没有其他预处理令牌可用。

第一个参数A不会出现在宏的替换列表中,因此不会对相应的参数执行任何操作。第二个参数B发生,因此相应的参数宏展开为2,替换列表中出现的B被扩展替换。