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

C 语言开发问题:使用 <assert.h> 时,定义的 #define NDEBUG 不生效

问题与处理策略

问题描述
#include <stdio.h>
#include <assert.h>#define NDEBUGint divide(int a, int b) {assert(b != 0);  // 确保除数不为 0return a / b;
}int main() {printf("%d\n", divide(10, 2));printf("%d\n", divide(10, 0));return 0;
}
# 输出结果5
Assertion failed: b != 0
  • 其中,定义的 #define NDEBUG 不生效,assert 操作还是发生
问题原因
  1. #define NDEBUG 必须写在 #include <assert.h> 之前,否则 assert() 不会被禁用

  2. assert 是一个宏,<assert.h> 在首次包含时会根据 NDEBUG 是否存在来决定 assert() 的行为,详见源码

#ifdef NDEBUG#define assert(expression) ((void)0)#else_ACRTIMP void __cdecl _wassert(_In_z_ wchar_t const* _Message,_In_z_ wchar_t const* _File,_In_   unsigned       _Line);#define assert(expression) (void)(                                                       \(!!(expression)) ||                                                              \(_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) \)#endif
处理策略
  • #define NDEBUG 必须要在 #include <assert.h> 之前
#define NDEBUG#include <stdio.h>
#include <assert.h>int divide(int a, int b) {assert(b != 0);  // 确保除数不为 0return a / b;
}int main() {printf("%d\n", divide(10, 2));printf("%d\n", divide(10, 0));return 0;
}
# 输出结果5
(进程 23256)已退出,代码为 -1073741676 (0xc0000094)。
http://www.dtcms.com/a/146792.html

相关文章:

  • Transformer框架解析:从“Attention is All You Need”到现代AI基石
  • 20.3 使用技巧9
  • 回车键监听
  • NLP与社区检测算法的结合:文本中的社区发现
  • OpenCV 图形API(49)颜色空间转换-----将 NV12 格式的图像数据转换为 BGR 颜色空间函数NV12toBGR()
  • Linux进程5-进程通信常见的几种方式、信号概述及分类、kill函数及命令、语法介绍
  • flutter 专题 六十三 Flutter入门与实战作者:xiangzhihong8Fluter 应用调试
  • WINDOWS下使用命令行读取本地摄像头FFMPEG+DirectShow,ffplay直接播放摄像头数据
  • 安装ntfs硬盘系统时,报错Error: Unable to find a match: epel-release的解决方法
  • Federated Feature Augmentation and Alignment
  • ECharts散点图-散点图13,附视频讲解与代码下载
  • 机器学习-08-推荐算法-案例
  • Cad c# 射线法判断点在多边形内外
  • 淘宝店铺详情API接口返回数据说明
  • 精益数据分析(10/126):深度剖析数据指标,驱动创业决策
  • EXCEL学习
  • 天元证券|AI驱动需求井喷 光模块上市公司业绩爆发
  • Oracle for Linux安装和配置(11)——Linux配置
  • 深入理解 DML 和 DQL:SQL 数据操作与查询全解析
  • Spring Boot 集成 Redis 实战总结
  • 智能对讲机:通信技术的革新与“危急特”场景的守护者
  • 【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试
  • C++如何处理多线程环境下的异常?如何确保资源在异常情况下也能正确释放
  • 【scikit-learn基础】--『监督学习』之 均值聚类
  • Android 15强制edge-to-edge全面屏体验
  • docker部署ruoyi-vue-pro前后端详细笔记
  • Linux:权限相关问题
  • 一款支持多线程的批量任务均衡器
  • AI日报 - 2024年04月22日
  • 实验四-用户和权限管理