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的代码显示区域自动拉长效果
Dec 07 Javascript
JavaScript基础语法让人疑惑的地方小结
May 23 Javascript
将input file的选择的文件清空的两种解决方案
Oct 21 Javascript
js跳转页面方法实现汇总
Feb 11 Javascript
JavaScript实现在标题栏上显示当前日期的方法
Mar 19 Javascript
基于React.js实现原生js拖拽效果引发的思考
Mar 30 Javascript
vue动态路由实现多级嵌套面包屑的思路与方法
Aug 16 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
Feb 20 jQuery
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
Sep 04 Javascript
记录vue做微信自定义分享的一些问题
Sep 12 Javascript
原生js+ajax分页组件
Jan 30 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 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中使用sockets:从新闻组中获取文章
2006/10/09 PHP
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
javascript获取选中的文本的方法代码
2013/10/30 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
javascript中innerText和innerHTML属性用法实例分析
2015/05/13 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
浅谈Nodejs观察者模式
2015/10/13 NodeJs
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
Javascript的this用法
2017/01/16 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
详解Python爬虫的基本写法
2016/01/08 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
Css3新特性应用之形状总结
2016/12/08 HTML / CSS
单位承诺书格式
2014/05/21 职场文书
教师求职自荐书
2014/06/14 职场文书
2014年终个人工作总结
2014/11/07 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
安全生产培训心得体会
2016/01/18 职场文书
Linux中sftp常用命令整理
2022/06/28 Servers