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 入门级学习笔记及源码
Jan 22 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
使用jquery实现div的tab切换实例代码
May 27 Javascript
验证控件与Button的OnClientClick事件详细解析
Dec 04 Javascript
使用js显示当前时间示例
Mar 02 Javascript
js中使用replace方法完成某个字符的转换
Aug 20 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
Mar 18 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
Sep 15 Javascript
基于 webpack2 实现的多入口项目脚手架详解
Jun 26 Javascript
常用的9个JavaScript图表库详解
Dec 19 Javascript
react组件基本用法示例小结
Apr 27 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
Nov 03 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的pcntl多进程用法实例
2015/03/19 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
php实现学生管理系统
2020/03/21 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
javascript 写类方式之八
2009/07/05 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
JS+JSP checkBox 全选具体实现
2014/01/02 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
jquery实现输入框实时输入触发事件代码
2016/12/21 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
2020/04/08 Javascript
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
python模拟点击网页按钮实现方法
2020/02/25 Python
python 合并多个excel中同名的sheet
2021/01/22 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
init进程的作用
2015/08/20 面试题
介绍一下mysql的日期和时间函数
2013/03/28 面试题
土建资料员岗位职责
2014/01/04 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
2014国庆节标语口号
2014/09/19 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
如何利用Python实现一个论文降重工具
2021/07/09 Python
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫