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 EasyUI API 中文文档 - Draggable 可拖拽
Sep 29 Javascript
JS实现模仿微博发布效果实例代码
Dec 16 Javascript
jquery 表格排序、实时搜索表格内容(附图)
May 19 Javascript
node.js中的fs.writeFile方法使用说明
Dec 14 Javascript
JavaScript 是什么意思
Sep 22 Javascript
Flask中获取小程序Request数据的两种方法
May 12 Javascript
Vue.js常用指令之循环使用v-for指令教程
Jun 27 Javascript
React中的refs的使用教程
Feb 13 Javascript
JS表单传值和URL编码转换
Mar 03 Javascript
vue 基于element-ui 分页组件封装的实例代码
Dec 10 Javascript
你可能不知道的CORS跨域资源共享
Mar 13 Javascript
ant design vue中表格指定格式渲染方式
Oct 28 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
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
php英文单词统计器
2016/06/23 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
JS Timing
2007/04/21 Javascript
document.compatMode介绍
2009/05/21 Javascript
介绍JavaScript的一个微型模版
2015/06/24 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
微信小程序实现的picker多级联动功能示例
2019/05/23 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
JavaScript判断数组类型的方法
2019/10/23 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
2020/07/15 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
js前端传json后台接收‘‘被转为quot的问题解决
2020/11/12 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
Python入门篇之条件、循环
2014/10/17 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
2015/05/14 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
2018/01/24 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
Bootstrap 学习分享
2012/11/12 HTML / CSS
法学专业应届生求职信
2013/10/16 职场文书
幼师辞职信范文
2015/02/27 职场文书
培训计划通知
2015/07/15 职场文书
2015中秋祝酒词
2015/08/12 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android