当前位置: 首页 > news >正文

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

文章目录

    • 功能说明
    • 实现
    • 示例
    • 解析
    • 扩展

功能说明

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

#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)
http://www.lryc.cn/news/102086.html

相关文章:

  • UE5引擎源码小记 —反射信息注册过程
  • Redis缓存预热
  • Android 耗时分析(adb shell/Studio CPU Profiler/插桩Trace API)
  • 保护隐私与安全的防关联、多开浏览器
  • CloudStudio搭建Next框架博客_抛开电脑性能在云端编程(沉浸式体验)
  • 【FPGA IP系列】FIFO深度计算详解
  • JavaScript中语句和表达式
  • 打卡力扣题目十
  • UniApp实现API接口封装与请求方法的设计与开发方法
  • 利用小波分解信号,再重构
  • QT数据库编程
  • 基于stm32单片机的直流电机速度控制——LZW
  • 实际项目中使用mockjs模拟数据
  • 【家庭公网IPv6】
  • 【iOS】Frame与Bounds的区别详解
  • SpringBoot百货超市商城系统 附带详细运行指导视频
  • 【实践篇】推荐算法PaaS化探索与实践 | 京东云技术团队
  • 持续贡献开源力量,棱镜七彩加入openKylin
  • Kafka的消费者如何管理偏移量?
  • IntelliJ IDEA流行的构建工具——Gradle
  • nacos源码打包及相关配置
  • 【机器学习】Multiple Variable Linear Regression
  • 自己创建的类,其他类中使用错误
  • Packet Tracer – 使用 TFTP 服务器升级思科 IOS 映像。
  • 并查集基础
  • C# 循环等知识点
  • 1.1.2 SpringCloud 版本问题
  • Android AIDL 使用
  • MongoDB——命令详解
  • 机器学习深度学习——多层感知机的简洁实现