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

功能说明

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

#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)

猜你喜欢

转载自blog.csdn.net/tyustli/article/details/132009247
今日推荐