首页 新闻 会员 周边

有一个 C++ 宏 看不懂

0
[已解决问题] 解决于 2015-10-20 16:25
#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,怎么都不看懂,哪位高人给指点一二

莫压枯枯地的主页 莫压枯枯地 | 菜鸟二级 | 园豆:220
提问于:2015-06-10 20:18
< >
分享
最佳答案
0
/*
1、PP_NARG宏展开可以得到:PP_NARG_ ( a, b, c, PP_RSEQ_N() )
2、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 )
3、PP_NARG_宏展开得到: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()
4、分别把BRACKET_L()和BRACKET_L()展开,即替换为"("和")",得到:PP_ARG_N (a, b, c, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 )
5、那么最终就变为调用宏函数PP_ARG_N,并取得参数N。可以看到,参数N是第17个参数,那么对应的第17个参数正好是3,所以答案为3.
*/
奖励园豆:5
aspnet | 初学一级 |园豆:79 | 2015-06-10 22:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册