转载:C语言善用断言(assert),提高你的Debug能力

本文详细介绍了C语言中的断言(assert)机制,包括其工作原理、如何使用以及最佳实践。断言可以有效地帮助开发者在调试阶段捕捉并定位程序中的逻辑错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

断言可以对在系统中隐藏很深,用其它手段极难发现的问题进行定位,并且输出信息很详细,可以很好地解决大多数C语言编译器错误信息输出不详细的问题。
断言是对某种条件进行检测,若条件成立则无反应,否则程序执行到断言处终止,同时输出为成立的条件。
assert是一个宏定义,并不是函数。
#include <assert.h>//assert所在头文件
void main()
{
int i = 9;
assert(i == 0);
}

则程序输出如下:

Assertion failed!
Program: E:C _assert.exeFile: E:C _assert.c, Line 8Expression: i == 0
This application has requested the Runtime to terminate it in an unPlease contact the application's support team for more information.
经常调用断言,会极大地增加程序的开销,可以通过以下方法使断言机制,使只在debug下,使用断言机制。
这种情况下,不要包含头文件 assert.h
#ifndef NDEBUG
#define assert(exp) ((void)0)#else#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )
在没有定义 NDEBUG下,assert被定义为 (void)0,无意义语句,而且对程序没有什么影响。

在定义NDEBUG时,断言会输出 不成立的条件 和 语句所在文件和行,所以我们可以在debug时,在上述代码之前,定义 NDEBUG ,在程序作为成品交出时, 删除NDEBUG的宏定义。

使用原则
1. 一个断言只能检测一个条件。
2. 断言检查只是辅助条件,不能替代条件检测
3. 不能使用改变环境语句的使用。
4. 频繁使用断言也会降低效率。并且它的强制停止所以不适合嵌入式程序和服务器,但也可以改写只报错误而不停止,即不调用abort()。
5. 不要浪费别人的时间—详细说明不清楚的断言;消除所做的隐式假定,或者利用断言检查其正确性例如:有时候我们会不自觉的认为一个字节占8位,或者说一个long型占据4个字节,这些都是对编译程序或操作系统做的一些假定。这使得我们需要在程序中使用断言例如ASSERT(sizeof(long)==4&&CHAR_BIT==8)。
6. 断言是进行调试检查的简单方法。要使用断言来检查绝对不应该发生的非法情况,不要混淆非法情况和错误情况,错误情况是需要在最终产品中处理的。
7. 利用断言对函数的参数进行确认,并且当程序员使用了无定义特性时向程序员报警。
8. 当编写函数时,应反复问自己做了哪些假定,一旦确定了相应的假定,就要使用断言对所做的假定进行检验,或者重新编写代码去除假定。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值