打印

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

[复制链接]
1334|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
angerbird|  楼主 | 2017-12-12 22:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression );assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。


沙发
angerbird|  楼主 | 2017-12-12 22:54 | 只看该作者
使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用。

使用特权

评论回复
板凳
angerbird|  楼主 | 2017-12-12 22:56 | 只看该作者
示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
按照这个设计,会很有益处的

使用特权

评论回复
地板
angerbird|  楼主 | 2017-12-12 23:00 | 只看该作者
用法总结与注意事项:
  1)在函数开始处检验传入参数的合法性如:
复制代码
int resetBufferSize(int nNewSize)
{
  //功能:改变缓冲区大小,
  //参数:nNewSize 缓冲区新长度
  //返回值:缓冲区当前长度
  //说明:保持原信息内容不变     nNewSize<=0表示清除缓冲区
  assert(nNewSize >= 0);
  assert(nNewSize <= MAX_BUFFER_SIZE);
  ...
}

使用特权

评论回复
5
angerbird|  楼主 | 2017-12-12 23:02 | 只看该作者
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,如:
  不好:
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
  好:
assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);

使用特权

评论回复
6
angerbird|  楼主 | 2017-12-12 23:06 | 只看该作者
3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题,如:

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

  正确:
assert(i < 100);
i++;

使用特权

评论回复
7
angerbird|  楼主 | 2017-12-12 23:07 | 只看该作者
4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。

  5)有的地方,assert不能代替条件过滤。

使用特权

评论回复
8
angerbird|  楼主 | 2017-12-12 23:09 | 只看该作者
assert是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的。c语言异常可以通过条件判断来处理,其它语言有各自的异常处理机制。

一个非常简单的使用assert的规律就是,在方法或者函数的最开始使用,如果在方法的中间使用则需要慎重考虑是否是应该的。方法的最开始还没开始一个功能过程,在一个功能过程执行中出现的问题几乎都是异常。

使用特权

评论回复
9
smilingangel| | 2017-12-13 23:17 | 只看该作者
angerbird 发表于 2017-12-12 22:54
使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含 ...

这个assert的缺点是需要多注意的。

使用特权

评论回复
10
firstblood| | 2017-12-18 21:16 | 只看该作者
assert的这些用法还是需要特谨慎的

使用特权

评论回复
11
baimiaocun2015| | 2017-12-18 23:26 | 只看该作者
这个主要是用于检查参数或函数的合法性,防止程序因内存的错误操作的跑飞

使用特权

评论回复
12
tongbu2015| | 2017-12-23 13:55 | 只看该作者
这个断言的使用,不就是为了进行程序问题的监控么?

使用特权

评论回复
13
tongbu2015| | 2017-12-23 13:57 | 只看该作者
angerbird 发表于 2017-12-12 22:54
使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含 ...

这一点还是需要多注意的,,assert的使用也不能太频繁的

使用特权

评论回复
14
zhangbo1985| | 2017-12-23 16:08 | 只看该作者
angerbird 发表于 2017-12-12 23:02
2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,如 ...

要注意这些写法规则的哈

使用特权

评论回复
15
ah9b87| | 2017-12-24 19:16 | 只看该作者
看来库函数的功能不少啊

使用特权

评论回复
16
vivilzb1985| | 2017-12-24 22:02 | 只看该作者
这个经常在程序开发中见到的,还不怎了解其用处的

使用特权

评论回复
17
vivilzb1985| | 2017-12-24 22:04 | 只看该作者
这里介绍的非常详细的,直接学习额

使用特权

评论回复
18
shenmu2012| | 2017-12-25 22:14 | 只看该作者
这个不就是程序开发中常用到的断言么

使用特权

评论回复
19
chuntian2016| | 2017-12-29 21:36 | 只看该作者
void assert( int expression );assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

使用特权

评论回复
20
chuntian2016| | 2017-12-29 21:36 | 只看该作者
发生异常时,及时终止程序的调试运行的才是关键

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

4032

帖子

5

粉丝