【宏定义】——检验条件是否成立,并返回指定的值

功能说明

宏检验条件是否成立,并返回指定的值

#define TU_VERIFY(...) _GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED)(__VA_ARGS__)
  • TU_VERIFY(1) 检验为,啥也不干
  • TU_VERIFY(0) 校验为,函数返回,返回值为 false
  • TU_VERIFY(87, 1) 检验为,啥也不干
  • TU_VERIFY(0, 100) 检验为,函数返回,返回值为 100

实现

// 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__)

示例

#include <stdio.h>
#include <stdbool.h>

// 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__)

static int verify_func(int cond, int value)
{
    TU_VERIFY(cond, value);

    return 0xa5;
}

int main(int argc, char *argv[])
{
    printf("%x \r\n", verify_func(87, 1));
    printf("%x \r\n", verify_func(0, 100));

    return 0;
}

结果打印

a5
64

解析

  • 该宏最少传入一个参数,最多传入两个参数
  • __VA_ARGS__ 可以理解为占位符,当只有一个参数时,该宏展开为 _GET_3RD_ARG(xxx, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED) 得到的就是 TU_VERIFY_1ARGS,所以执行的就是 TU_VERIFY_1ARGS(xxx)
  • 当有两个参数时,该宏展开为 _GET_3RD_ARG(xxx, yyy, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, UNUSED) 得到的就是 TU_VERIFY_2ARGS,所以执行的就是 TU_VERIFY_2ARGS(xxx, yyy)

扩展

handler 处理的功能

/*------------------------------------------------------------------*/
/* 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__)
  • 该宏最少传入两个参数,最多传入三个参数
  • __VA_ARGS__ 可以理解为占位符,当只有一个参数时,该宏展开为 _GET_4TH_ARG(xxx, yyy, TU_VERIFY_HDLR_3ARGS, TU_VERIFY_HDLR_2ARGS, UNUSED) 得到的就是 TU_VERIFY_HDLR_2ARGS,所以执行的就是 TU_VERIFY_HDLR_2ARGS(xxx, yyy)
  • 当有三个参数时,该宏展开为 _GET_4TH_ARG(xxx, yyy, zzz, TU_VERIFY_HDLR_3ARGS, TU_VERIFY_HDLR_2ARGS, UNUSED) 得到的就是 TU_VERIFY_HDLR_3ARGS,所以执行的就是 TU_VERIFY_HDLR_3ARGS(xxx, yyy, zzz)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值