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 子窗口操作父窗口的代码
Sep 21 Javascript
基于jquery的合并table相同单元格的插件(精简版)
Apr 05 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
Apr 19 Javascript
UI Events 用户界面事件
Jun 27 Javascript
jQuery Ajax异步处理Json数据详解
Nov 05 Javascript
JavaScript中instanceof运算符的用法总结
Nov 19 Javascript
jQuery Validate 验证,校验规则写在控件中的具体实例
Feb 27 Javascript
一系列Bootstrap导航条使用方法分享
Apr 29 Javascript
微信小程序 wx.request方法的异步封装实例详解
May 18 Javascript
详解vue axios中文文档
Sep 12 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
May 07 Javascript
React实现todolist功能
Dec 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
用PHP实现多级树型菜单
2006/10/09 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
如何在PHP中使用数组
2020/06/09 PHP
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
python中尾递归用法实例详解
2015/04/28 Python
ansible作为python模块库使用的方法实例
2017/01/17 Python
django 自定义过滤器的实现
2019/02/26 Python
Django多数据库的实现过程详解
2019/08/01 Python
python django model联合主键的例子
2019/08/06 Python
python 魔法函数实例及解析
2019/09/25 Python
基于Python中的yield表达式介绍
2019/11/19 Python
浅谈python中频繁的print到底能浪费多长时间
2020/02/21 Python
python中for in的用法详解
2020/04/17 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
柯基袜:Corgi Socks
2017/01/26 全球购物
迎新晚会主持词
2014/03/24 职场文书
师德模范事迹材料
2014/06/03 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
2015年暑期社会实践总结
2015/07/13 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
门面租赁合同范文
2019/08/06 职场文书