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

c++,宏 - 在debug/release中都能用的断言

文章目录

    • c++,宏 - 在debug/release中都能用的断言
    • 概述
    • 笔记
      • 断言宏定义
    • 调用代码
    • 效果
      • debug
      • release
    • 备注
    • END

c++,宏 - 在debug/release中都能用的断言

概述

预定义宏 NDEBUG,表示现在是release编译模式。
预定义宏 _DEBUG, 表示现在是debug编译模式。
在普通宏中或者正常代码行中,不能用预定义宏的值来做条件判断。否则就会在其中一种编译模式下(debug/release)报错 - NDEBUG/-DEBUG未定义

e.g. 错误的姿势
if (NDEBUG) {printf("on release mode\r\n");}
if (_DEBUG) {printf("on debug mode\r\n");}

注意这个细节后,就可以写出一个在debug/release编译模式下都能用的宏。

想在程序中前置条件不满足时,不让程序继续跑, 显示错误发生的文件/行号后, 直接断言或退出。
写了一个断言宏,在debug/release编译模式下都能用。

笔记

断言宏定义

// 打印文件错误行信息
#if defined(NDEBUG)
#define MY_ASSERT_FILE_LINE() \
do { \
    fprintf(stderr, "[%s] %s:%d\r\n", "FATAL", __FILE__, __LINE__); \
    std::abort(); \
} while (0)
#elif defined(_DEBUG)
#define MY_ASSERT_FILE_LINE() \
do { \
    assert(false); \
} while (0)
#endif

// 自定义断言
#define MY_ASSERT(expr, fmt, ...) \
do { \
    if (!(expr)) { \
        fprintf(stderr, fmt, ##__VA_ARGS__); \
        fprintf(stderr, " | "); \
        MY_ASSERT_FILE_LINE(); \
    } \
} while (0)

调用代码

MY_ASSERT(true, "true = %d", (true == bFixPosOk));
MY_ASSERT(false, "false = %d", (false == bFixPosOk));

效果

debug

在这里插入图片描述

release

在这里插入图片描述

备注

宏的条件编译写法, 最好用 defined, 更通用。可以进行多条件的判断(宏是否存在,宏的值的比较)

// 好的写法
#if defined(NDEBUG)
#elif defined(_DEBUG)
#endif

// 可以进行多条件的判断
#if (defined(NDEBUG) && defined(MY_CFG_FLAG) && (MY_CFG_FLAG > 200))
#elif defined(_DEBUG)
#endif

// 感觉不好(不通用)的写法
#ifdef NDEBUG
#elif _DEBUG
#endif

END

相关文章:

  • 3、fabric实现多机多卡训练
  • 性能测试核心流程和概念
  • NoSQL 数据库的适用场景与局限性分析
  • 常用的测试用例
  • level2数据说明,逐笔成交,逐笔委托,股票十档行情
  • 在海量数据中精准定位:BloomFilter的工作原理与实战指南
  • linux ACL权限控制之组权限控制程序设计
  • 卡特兰数问题
  • 端侧设备(如路由器、家庭网关、边缘计算盒子、工业网关等)的典型系统、硬件配置和内存大小
  • 【矩阵快速幂】P2100 凌乱的地下室|省选-
  • AI+基础工具:解锁业务增长原子级能力,To B 落地新方向
  • 红宝书第十九讲:详解JavaScript的Fetch API与Ajax请求
  • 利用虚拟化技术实现高级Hook
  • Success is the sum of small efforts repeated day in and day out.
  • 1.Python 计算机二级题库:选择题
  • 【大模型】视觉语言模型:Qwen2.5-VL的使用
  • 分布式ID生成器:雪花算法原理与应用解析
  • 航拍数据集汇总,覆盖车辆/船舶检测/物体评估/城市景观……
  • 了解图像质量评价指标PSNR
  • JAVA实现动态IP黑名单过滤
  • 你下水好多下水道bd/seo岗位工作内容
  • 嘉兴网站建设推广/如何提升百度关键词排名
  • 用net语言做网站平台好不好/百度竞价冷门产品
  • 阎良做网站/衡水seo优化
  • 网站及数据库怎么做后门/迅雷下载磁力天堂
  • 网络优化工程师是做什么的/长沙关键词优化新报价