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

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.xdnf.cn/news/1032.html

相关文章:

  • vin码识别技术-车辆vin识别代码-Java接口集成
  • 《理解C++宏:从#define到条件编译》
  • 【工具】VS Code/Cursor 编辑器状态栏颜色自定义指南
  • 装饰模式:动态扩展对象功能的优雅设计
  • AI Agent开发第35课-揭秘RAG系统的致命漏洞与防御策略
  • 极刻AI搜v1.0 问一次问题 AI工具一起答
  • 城市客运安全员证适用岗位及要求
  • QtCreator的设计器、预览功能能看到程序图标,编译运行后图标消失
  • 关于金碟云星空批号问题
  • 自动化测试
  • Psychology 101 期末测验(附答案)
  • Ubuntu 系统下安装和使用性能分析工具 perf
  • HarmonyOS-ArkUI: animateTo 显式动画
  • Git SSH 密钥多个 Git 来源
  • 承兑汇票文字录入解决方案-承兑汇票识别接口-C++集成方式
  • SQL优化
  • 安卓逆向工程:从APK到内核的层级技术解析
  • 聚客AI万字解密AI-Agent大模型智能体:从架构设计到工业落地的全栈指南
  • 算法题(130):激光炸弹
  • 力扣刷题Day 23:最长连续序列(128)
  • Azkaban集群搭建
  • 基于Python的图片/签名转CAD小工具开发方案
  • 13.电阻在EMC设计中的妙用
  • 黑苹果win10和macOS双系统
  • C++ 的史诗级进化:从C++98到C++20
  • MySQL 触发器
  • 三轴云台之激光测距技术篇
  • 软件工程师中级考试-上午知识点总结(上)
  • 小公司面经,当练手了
  • WPS科大讯飞定制版 11.4.1.5| 无广告,省电和降低占用,可与普通版本共存