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 相关文章推荐
javascript中利用数组实现的循环队列代码
Jan 24 Javascript
JS常用字符串处理方法应用总结
May 22 Javascript
JavaScript闭包详解
Feb 02 Javascript
通过隐藏iframe实现无刷新上传文件操作
Mar 16 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
May 25 jQuery
vue2.x 父组件监听子组件事件并传回信息的方法
Jul 17 Javascript
原生js实现移动端触摸轮播的示例代码
Dec 22 Javascript
详解ES6中的 Set Map 数据结构学习总结
Nov 06 Javascript
vue-router结合vuex实现用户权限控制功能
Nov 14 Javascript
JavaScript实现多个物体同时运动
Mar 12 Javascript
基于ajax实现上传图片代码示例解析
Dec 03 Javascript
vue实现轮播图帧率播放
Jan 26 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+java实现自动新闻滚动窗口
2006/10/09 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
文本框中,回车键触发事件的js代码[多浏览器兼容]
2010/06/07 Javascript
jquery自定义下拉列表示例
2014/04/25 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
Javascript typeof与instanceof的区别
2016/10/18 Javascript
jQuery post数据至ashx实例详解
2016/11/18 Javascript
socket.io实现在线群聊功能
2017/04/07 Javascript
nodejs判断文件、文件夹是否存在及删除的方法
2017/11/10 NodeJs
Vue组件开发技巧总结
2018/03/04 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
简介Django中内置的一些中间件
2015/07/24 Python
Python读写Json涉及到中文的处理方法
2016/09/12 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
python实现可逆简单的加密算法
2019/03/22 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
德国PC硬件网站:CASEKING
2016/10/20 全球购物
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
九年级科学教学反思
2014/01/29 职场文书
大学毕业感言一句话
2014/02/06 职场文书
《老山界》教学反思
2014/04/08 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
环卫处个人工作总结
2015/03/04 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技