assert()函数用法探讨与总结

[复制链接]
184|21
 楼主 | 2017-12-12 22:53 | 显示全部楼层 |阅读模式
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression );assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。


 楼主 | 2017-12-12 22:54 | 显示全部楼层
使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用。
 楼主 | 2017-12-12 22:56 | 显示全部楼层
示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
按照这个设计,会很有益处的
 楼主 | 2017-12-12 23:00 | 显示全部楼层
用法总结与注意事项:
  1)在函数开始处检验传入参数的合法性如:
复制代码
int resetBufferSize(int nNewSize)
{
  //功能:改变缓冲区大小,
  //参数:nNewSize 缓冲区新长度
  //返回值:缓冲区当前长度
  //说明:保持原信息内容不变     nNewSize<=0表示清除缓冲区
  assert(nNewSize >= 0);
  assert(nNewSize <= MAX_BUFFER_SIZE);
  ...
}
 楼主 | 2017-12-12 23:02 | 显示全部楼层
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,如:
  不好:
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
  好:
assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
 楼主 | 2017-12-12 23:06 | 显示全部楼层
3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题,如:

  错误:
assert(i++ < 100);
  这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

  正确:
assert(i < 100);
i++;
 楼主 | 2017-12-12 23:07 | 显示全部楼层
4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。

  5)有的地方,assert不能代替条件过滤。
 楼主 | 2017-12-12 23:09 | 显示全部楼层
assert是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的。c语言异常可以通过条件判断来处理,其它语言有各自的异常处理机制。

一个非常简单的使用assert的规律就是,在方法或者函数的最开始使用,如果在方法的中间使用则需要慎重考虑是否是应该的。方法的最开始还没开始一个功能过程,在一个功能过程执行中出现的问题几乎都是异常。
| 2017-12-13 23:17 | 显示全部楼层
angerbird 发表于 2017-12-12 22:54
使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含 ...

这个assert的缺点是需要多注意的。
| 2017-12-18 21:16 | 显示全部楼层
assert的这些用法还是需要特谨慎的
| 2017-12-18 23:26 | 显示全部楼层
这个主要是用于检查参数或函数的合法性,防止程序因内存的错误操作的跑飞
| 2017-12-23 13:55 | 显示全部楼层
这个断言的使用,不就是为了进行程序问题的监控么?
| 2017-12-23 13:57 | 显示全部楼层
angerbird 发表于 2017-12-12 22:54
使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含 ...

这一点还是需要多注意的,,assert的使用也不能太频繁的
| 2017-12-23 16:08 | 显示全部楼层
angerbird 发表于 2017-12-12 23:02
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,如 ...

要注意这些写法规则的哈
| 2017-12-24 19:16 | 显示全部楼层
看来库函数的功能不少啊
| 2017-12-24 22:02 | 显示全部楼层
这个经常在程序开发中见到的,还不怎了解其用处的
| 2017-12-24 22:04 | 显示全部楼层
这里介绍的非常详细的,直接学习额
| 2017-12-25 22:14 | 显示全部楼层
这个不就是程序开发中常用到的断言么
| 2017-12-29 21:36 | 显示全部楼层
void assert( int expression );assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
| 2017-12-29 21:36 | 显示全部楼层
发生异常时,及时终止程序的调试运行的才是关键
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册 手机登录
高级模式

论坛热帖

分享 快速回复 返回顶部 返回列表