#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,怎么都不看懂,哪位高人给指点一二
/*
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.
*/