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 相关文章推荐
extjs 为某个事件设置拦截器
Jan 15 Javascript
Jquery Autocomplete 结合asp.net使用要点
Oct 29 Javascript
javascript中的循环语句for语句深入理解
Apr 04 Javascript
jQuery实现多按钮单击变色
Nov 27 Javascript
javascript Array 数组常用方法
Apr 05 Javascript
前端面试题及答案整理(二)
Aug 26 Javascript
javascript中mouseenter与mouseover的异同
Jun 06 Javascript
微信小程序开发背景图显示功能
Aug 08 Javascript
详解在React项目中安装并使用Less(用法总结)
Mar 18 Javascript
JS数组splice操作实例分析
Oct 12 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 Javascript
vue数据字典取键值项目的字典问题
Apr 12 Vue.js
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输出时间差函数代码
2013/01/28 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
php类常量用法实例分析
2015/07/09 PHP
利用php生成验证码
2017/02/23 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
点击标签切换和自动切换DIV选项卡
2014/08/10 Javascript
微信分享的标题、缩略图、连接及描述设置方法
2014/10/14 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
Python读取YUV文件,并显示的方法
2018/12/04 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
《水乡歌》教学反思
2014/04/24 职场文书
社区工作者演讲稿
2014/05/23 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
人事局接收函
2015/01/31 职场文书
小学元宵节活动总结
2015/02/06 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书