一个宏看不懂,请教

emyueguang 2015-06-10 08:07:55

#define BRACKET_L() (
#define BRACKET_R() )
#define PP_NARG(...) \
PP_NARG_ ( __VA_ARGS__, PP_RSEQ_N() )
#define PP_NARG_(...) \
PP_ARG_N BRACKET_L() __VA_ARGS__ BRACKET_R()
#define PP_ARG_N( \
_1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
_11,_12,_13,_14,_15,_16, N,...) N
#define PP_RSEQ_N() \
16,15,14,13,12,11,10, \
9,8,7,6,5,4,3,2,1,0

调用PP_NARG(A,B,C) 就返回3,就是怎么想也想不明白,希望哪位高人指点我一下,另加:这个是在windows平台下
...全文
155 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly_dragon_fly 2015-06-11
  • 打赏
  • 举报
回复
而且PP开头,让我想到boost的PP库,它里面有个宏叫 BOOST_PP_TUPLE_SIZE, 可以参考一下,
fly_dragon_fly 2015-06-11
  • 打赏
  • 举报
回复
计算tuple的个数,看下面展开 PP_NARG(A,B,C) =>PP_NARG_(A,B,C,16,15,14,13,12,11,10, 9,8,7,6,5,4,3,2,1,0) =>PP_ARG_N(A,B,C,16,15,14,13,12,11,10, 9,8,7,6,5,4,3,2,1,0) 最后就是一个对齐的问题了 _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, _11,_12,_13,_14,_15,_16, N A, B, C, 16,15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3,2,1,0 而PP_ARG_N最后的结果是N, 看一下N对应的3
pengzhixi 2015-06-11
  • 打赏
  • 举报
回复
还挺有趣,限制不定参数个数不能大于16个
pengzhixi 2015-06-11
  • 打赏
  • 举报
回复
PP_ARG_N ( A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 )
除去前面_1,_2..这16个占位符,刚好3是第17个参数,也就是#define PP_ARG_N( _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, _11,_12,_13,_14,_15,_16, N,...) N 这里的N
pengzhixi 2015-06-11
  • 打赏
  • 举报
回复
这个宏是用来计算不定参数的个数的。 最终的形式应该是这样的 PP_ARG_N(A,B,C) #define PP_ARG_N( \ _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \ _11,_12,_13,_14,_15,_16, N,...) N 而下面这个就是计算个数的宏。
emyueguang 2015-06-11
  • 打赏
  • 举报
回复
经过各位高人的点拨,我醍醐灌顶! 分不多,请大家笑纳!
赵4老师 2015-06-11
  • 打赏
  • 举报
回复
奇技淫巧!
pengzhixi 2015-06-11
  • 打赏
  • 举报
回复
引用 7 楼 worldy 的回复:
[quote=引用 1 楼 JiangWenjie2014 的回复:]

PP_NARGS(A, B, C)
=> PP_NARG_ (A, B, C, PP_RSEQ_N())
=> PP_NARG_ (A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
=> PP_ARG_N BRACKET_L() A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 BRACKET_R()
=> PP_ARG_N ( A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 )
=> 3
=> PP_ARG_N ( A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 ) ==>(A,B,C,16,15,....1,0) 这个怎么就变成了3了? [/quote] 看#define PP_ARG_N( _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, _11,_12,_13,_14,_15,_16, N,...) N 这个宏
worldy 2015-06-11
  • 打赏
  • 举报
回复
引用 1 楼 JiangWenjie2014 的回复:

PP_NARGS(A, B, C)
=> PP_NARG_ (A, B, C, PP_RSEQ_N())
=> PP_NARG_ (A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
=> PP_ARG_N BRACKET_L() A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 BRACKET_R()
=> PP_ARG_N ( A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 )
=> 3
=> PP_ARG_N ( A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 ) ==>(A,B,C,16,15,....1,0) 这个怎么就变成了3了?
JiangWenjie2014 2015-06-10
  • 打赏
  • 举报
回复

PP_NARGS(A, B, C)
=> PP_NARG_ (A, B, C, PP_RSEQ_N())
=> PP_NARG_ (A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
=> PP_ARG_N BRACKET_L() A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 BRACKET_R()
=> PP_ARG_N ( A, B, C, 16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0 )
=> 3

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧