【C语言宏定义】C语言带参数宏定义应用解析

一、应用实例

代码如下(示例):

/*------------------------------------------------------------------*/
/* 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(0100)  
替换为
_GET_3RD_ARG(0100, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(0100)

_GET_3RD_ARG的宏替换如下:

_GET_3RD_ARG(0, 100, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(0100)
替换为
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__)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值