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 相关文章推荐
用js自动判断浏览器分辨率的代码
Jan 28 Javascript
Apply an AutoFormat to an Excel Spreadsheet
Jun 12 Javascript
javascript跑马灯悬停放大效果实现代码
Dec 12 Javascript
利用jQuery实现可输入搜索文字的下拉框
Oct 23 Javascript
javascript跨域原因以及解决方案分享
Apr 08 Javascript
javascript中undefined与null的区别
Aug 16 Javascript
Jquery 全选反选实例代码
Nov 19 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
Dec 13 Javascript
jQuery实现简单日期格式化功能示例
Sep 19 jQuery
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
Apr 17 Javascript
html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片
Jan 12 Javascript
JS实现斐波那契数列的五种方式(小结)
Sep 09 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截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
jQuery TextBox自动完成条
2009/07/22 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
如何在node环境实现“get数据解析”代码实例
2020/07/03 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
Django Admin中增加导出CSV功能过程解析
2019/09/04 Python
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
纽约手袋品牌:KARA
2018/03/18 全球购物
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
HQhair美国/加拿大:英国化妆品、美容及美发产品商城
2019/04/15 全球购物
舞蹈教育学专业推荐信
2013/11/27 职场文书
会计学生自我鉴定
2014/02/06 职场文书
法制宣传标语集锦
2014/06/25 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
地球上的星星观后感
2015/06/02 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
React更新渲染原理深入分析
2022/12/24 Javascript