原始笔记只有一行宏定义和一张示意图,这里把背景和用法补出来,方便回看。
问题:__VA_ARGS__ 在嵌套展开时会被当成单个参数
在 MSVC 等部分预处理器实现下,把 __VA_ARGS__ 直接传给另一个宏时,可能会被整体看作 一个 参数,而不是按逗号拆开继续传递,导致下游宏拿到的参数个数和预期不符。
一个常见 workaround:再套一层展开
#define MARCO_EXPAND(...) __VA_ARGS__
把要传给下游宏的 __VA_ARGS__ 先经过一次 MARCO_EXPAND(...),强制再展开一次,逗号才会重新被识别为参数分隔符。
典型用法形如:
#define CALL(macro, args) MARCO_EXPAND(macro args)
笔记中附的示意图保留下来:

后续可补的方向
- 不同编译器(GCC / Clang / MSVC)对
__VA_ARGS__展开顺序的差异 - 计数宏
PP_NARG、FOR_EACH等常见可变参宏的写法 - 使用
BOOST_PP_*替代手写宏的场景
FEATURED TAGS
Git
Cheat Sheet
Markdown
Tools
C++
Linker
Thread
Linux
TCP
Network
GDB
Debug
leetcode
链表
WSL
Ubuntu
Windows
Linux Kernel
GCC
Android
adb
Troubleshooting
Profiling
Sanitizer
glibc
MySQL
Database
Python
curl
Build
ELF
clang-format
CMake
Graphviz
Performance
vcpkg
Protobuf
排查
速查
内存
STL
调试
性能分析
性能
读书笔记
方法论
架构
网络
Timer
mbedTLS
TLS
安全
负载均衡
脚本
工具
LRU
二叉树
BST
中序遍历
回溯
二分查找
优先队列
排序
旋转数组
jenkins
部署