assert()函数用法总结(推荐)


Posted in Javascript onJanuary 25, 2017

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

#include <assert.h>
void assert( int expression );

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badptr.c:

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main( void )
{
    FILE *fp;
    fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
    assert( fp );              //所以这里不会出错
    fclose( fp );
    fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败
    assert( fp );              //所以这里出错
    fclose( fp );              //程序永远都执行不到这里来
    return 0;
}
[root@localhost error_process]# gcc badptr.c 
[root@localhost error_process]# ./a.out 
a.out: badptr.c:14: main: Assertion `fp' failed.

已放弃使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

#include <stdio.h>
#define NDEBUG
#include <assert.h>

用法总结与注意事项:

1)在函数开始处检验传入参数的合法性如:

int resetBufferSize(int nNewSize)
{
//功能:改变缓冲区大小,

//参数:nNewSize 缓冲区新长度

//返回值:缓冲区当前长度 

//说明:保持原信息内容不变   nNewSize<=0表示清除缓冲区

assert(nNewSize >= 0);

assert(nNewSize <= MAX_BUFFER_SIZE);

...
}

2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败,如:

不好:

assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

好:

assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);

3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题,如:

错误:

assert(i++ < 100);

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

正确:

assert(i < 100);
 i++;

4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。

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

以上所述是小编给大家介绍的assert()函数用法总结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
Jun 24 Javascript
jQuery动态设置form表单的enctype值(实现代码)
Jul 04 Javascript
javascript多物体运动实现方法分析
Jan 08 Javascript
Bootstrap3制作自己的导航栏
May 12 Javascript
jQuery动态创建元素以及追加节点的实现方法
Oct 20 Javascript
js实现添加删除表格(两种方法)
Apr 27 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
Nov 27 jQuery
Vue数据绑定实例写法
Aug 06 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
Sep 23 Javascript
如何在Vue中抽离接口配置文件
Oct 31 Javascript
node.JS路径解析之PATH模块使用方法详解
Feb 06 Javascript
vue制作toast组件npm包示例代码
Oct 29 Javascript
canvas知识总结
Jan 25 #Javascript
基于JavaScript实现自定义滚动条
Jan 25 #Javascript
基于javascript实现数字英文验证码
Jan 25 #Javascript
js阻止移动端页面滚动的两种方法
Jan 25 #Javascript
servlet+jquery实现文件上传进度条示例代码
Jan 25 #Javascript
json数据处理及数据绑定
Jan 25 #Javascript
详解jQuery中ajax.load()方法
Jan 25 #Javascript
You might like
通过对服务器端特性的配置加强php的安全
2006/10/09 PHP
php中\r \r\n \t的区别示例介绍
2014/02/08 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
Add a Table to a Word Document
2007/06/15 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
JavaScript和TypeScript中的void的具体使用
2019/09/12 Javascript
小程序两种滚动公告栏的实现方法
2019/09/17 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
[01:51]2014DOTA2西雅图邀请赛 MVP 外卡赛black场间采访
2014/07/09 DOTA
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
Python中super的用法实例
2015/05/28 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
Python 判断奇数偶数的方法
2018/12/20 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
建筑专业自荐信
2013/10/18 职场文书
应届毕业生专业个人求职自荐信格式
2013/11/20 职场文书
四年级语文教学反思
2014/02/05 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
团购业务员岗位职责
2014/03/15 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
Pandas数据结构之Series的使用
2022/03/31 Python