一、应用实例
代码如下(示例):
/*------------------------------------------------------------------*/
/* Macro Generator
*------------------------------------------------------------------*/
// Helper to implement optional parameter for TU_VERIFY Macro family
#define _GET_3RD_ARG(arg1, arg2, arg3, ...) arg3
#define _GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
/*------------- Generator for TU_VERIFY and TU_VERIFY_HDLR -------------*/
#define TU_VERIFY_DEFINE(_cond, _handler, _ret) do \
{ \
if ( !(_cond) ) { _handler; return _ret; } \
} while(0)
/*------------------------------------------------------------------*/
/* TU_VERIFY
* - TU_VERIFY_1ARGS : return false if failed
* - TU_VERIFY_2ARGS : return provided value if failed
*------------------------------------------------------------------*/
#define TU_VERIFY_1ARGS(_cond) TU_VERIFY_DEFINE(_cond, , false)
#define TU_VERIFY_2ARGS(_cond, _ret) TU_VERIFY_DEFINE(_cond, , _ret)
#define TU_VERIFY(...) _GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(__VA_ARGS__)
/*------------------------------------------------------------------*/
/* TU_VERIFY WITH HANDLER
* - TU_VERIFY_HDLR_2ARGS : execute handler, return false if failed
* - TU_VERIFY_HDLR_3ARGS : execute handler, return provided error if failed
*------------------------------------------------------------------*/
#define TU_VERIFY_HDLR_2ARGS(_cond, _handler) TU_VERIFY_DEFINE(_cond, _handler, false)
#define TU_VERIFY_HDLR_3ARGS(_cond, _handler, _ret) TU_VERIFY_DEFINE(_cond, _handler, _ret)
#define TU_VERIFY_HDLR(...) _GET_4TH_ARG(__VA_ARGS__, TU_VERIFY_HDLR_3ARGS, TU_VERIFY_HDLR_2ARGS,UNUSED)(__VA_ARGS__)
二、代码解析
根据传入的参数个数和参数值,返回相应的值
#define TU_VERIFY(...) _GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(__VA_ARGS__)
“宏名+(…)” 虽然支持参数可变,但受到_GET_3RD_ARG的约束,TU_VERIFY(…)的只能传入1个或者2个参数,__VA_ARGS__用来替换可变参数的实参。
1. TU_VERIFY(1)
假设TU_VERIFY(1),则预编译过程大概如下:
TU_VERIFY(1)
替换为
_GET_3RD_ARG(1, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(1)
_GET_3RD_ARG的宏替换如下:
_GET_3RD_ARG(1, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(1)
替换为
TU_VERIFY_1ARGS(1)
TU_VERIFY_1ARGS的宏替换如下:
TU_VERIFY_1ARGS(1)
替换为
TU_VERIFY_DEFINE(1, , false)
TU_VERIFY_DEFINE的宏替换如下:
TU_VERIFY_DEFINE(1, , false)
替换为
do{ if ( !(1) ) { _handler; return _ret; } } while(0)
因此最终判断为真,无返回值。
2.TU_VERIFY(0,100)
假设TU_VERIFY(0,100),则预编译过程大概如下:
TU_VERIFY(0,100)
替换为
_GET_3RD_ARG(0,100, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(0,100)
_GET_3RD_ARG的宏替换如下:
_GET_3RD_ARG(0, 100, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(0,100)
替换为
TU_VERIFY_2ARGS(0, 100)
TU_VERIFY_2ARGS的宏替换如下:
TU_VERIFY_2ARGS(0, 100)
替换为
TU_VERIFY_DEFINE(0, , 100)
TU_VERIFY_DEFINE的宏替换如下:
TU_VERIFY_DEFINE(0, , 100)
替换为
do{ if ( !(0) ) { _handler; return 100; } } while(0)
因此最终判断为假,返回值为100。
三、总结
对于TU_VERIFY_HDLR(…)也是同样的原理。
#define TU_VERIFY_HDLR(...) _GET_4TH_ARG(__VA_ARGS__, TU_VERIFY_HDLR_3ARGS, TU_VERIFY_HDLR_2ARGS,UNUSED)(__VA_ARGS__)