C/C++ 可变参数宏, 编译器展开获取可变参数的长度.
参考https://groups.google.com/forum/#!forum/comp.std.c/d-6Mj5Lko_s
同时参考了cppformat源码
#define MARCO_EXPAND(...) __VA_ARGS__
#define RSEQ_N() 10,9,8,7,6,5,4,3,2,1,0
#define ARG_N(_1,_2,_3,_4,_5,_6,_7,_8,_9_10,N) N
#define GET_ARG_COUNT_INNER(...) MARCO_EXPAND(ARG_N(__VA_ARGS__))
#define GET_ARG_COUNT(...) GET_ARG_COUNT_INNER(__VA_ARGS__, RSEQ_N())
以上代码片对计算10个参数以内的数量的参数个数, 具体原理如下:
其中如下的宏展开之后就是一个串参数序列:
GET_ARG_COUNT(a, b, c) MARCO_EXPAND(ARG_N(a, b, c, 10,9,8,7,6,5,4,3,2,1,0))
而通过ARG_N(...) a, b, c, 10,9,8,7,6,5,4,3,2,1,0
这个宏展开之后可以理解为是一个反向的下标, 取出具体位置的数字即是最终的数值.需要说明下:RSEQ_N()宏中定义的数字, 跟ARG_N(...)宏中定义的数字代表的参数个数一定是相等的, 通俗一点理解起来:就是将数据列的反向序排列然后通过插入参数之后取互补位置的下标即可.