MSVC中的宏观扩展问题
Macro expansion problems in MSVC
我想知道为什么这个宏会扩展得如此之大。
#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
被扩展替换。
相关文章:
- HDF5Cpp 扩展复合数据集超板问题
- MSVC中的宏观扩展问题
- OpenMP 的扩展问题
- 使用 C++17 扩展使用声明时出现问题
- 扩展中的日期时间对象方法C++问题
- C 寿命扩展的问题
- Visual Studio中变异模板扩展的问题
- 参数包扩展问题
- 扩展现有的 Spirit 语法(AST 和 skipper 的问题)
- 扩展类c++的循环包含问题
- linux中的C++GLFW3全屏扩展问题
- MFC扩展dll资源加载问题
- 使用 python 扩展在 gdb 中打印特征类型时出现问题
- 覆盖使用模板参数包扩展声明的虚拟方法时遇到问题
- 在 Python 中扩展的 C++ 类中的 Seg 错误回调问题
- 节点扩展问题
- OpenGL扩展问题
- 传递参数时出现宏扩展问题
- Direct3d绘制2d精灵.扩展问题
- c++预处理器延迟扩展问题