assert()函数用法

简介: assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include void assert( int expression );   assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

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 ); //程序永远都执行不到这里来
return0;
}
复制代码

[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是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的。c语言异常可以通过条件判断来处理,其它语言有各自的异常处理机制。

一个非常简单的使用assert的规律就是,在方法或者函数的最开始使用,如果在方法的中间使用则需要慎重考虑是否是应该的。方法的最开始还没开始一个功能过程,在一个功能过程执行中出现的问题几乎都是异常。
 
 

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
安全 网络虚拟化 数据安全/隐私保护
蒂森克虏伯上云 加速跨地域访问 、降低网络延时
通过采用阿里云SD-WAN网络解决方案,快速地构建了蒂森克虏伯中国区大部分的工厂及分支机构的互联网络,网络质量得到很好的改善,进一步保证了业务的稳定性,IT运维成本得到大幅的降低。
1963 0
蒂森克虏伯上云 加速跨地域访问 、降低网络延时
|
流计算 API 存储
Apache Flink 零基础入门(五):流处理核心组件 Time&Window 深度解析
为什么要有 Window; Window 中的三个核心组件:WindowAssigner、Trigger 和 Evictor;Window 中怎么处理乱序数据,乱序数据是否允许延迟,以及怎么处理迟到的数据;最后我们梳理了整个 Window 的数据流程,以及 Window 中怎么保证 Exactly
Apache Flink 零基础入门(五):流处理核心组件 Time&Window 深度解析
支付宝卡包——核销卡劵(alipay.pass.instance.update)
接口名称:支付宝pass更新卡券实例接口 英文名称:alipay.pass.instance.update 上一步:[url]https://openclub.alipay.com/read.php?tid=13242&fid=72[/url] 下一步:[url]https://openclub.alipay.com/read.php?tid=13244&fid=72[/url] 一、注意事项 该接口主要用于使页面显示核销状态,且该接口还含有失效卡劵、更新卡劵功能。
2081 12
|
PHP
PHP按符号截取字符串的指定部分
字符串截取在php开发中是比较常用的;而且对于截取的需求也有很多种;就比如说对url链接的操作:http://baijunyao.com/article/12 有时我们想截取最后一个斜杠&#39;/&#39;后面的数字;有时我们又需要截取第一个斜杠&#39;/&#39;前面的内容判断用户输入的url链接带不带http://等等;...
1702 0
|
安全 数据安全/隐私保护 对象存储
智能媒体管理产品文档转换/预览功能介绍(3)---预览原理
智能媒体管理产品提供了 Cloud Native 架构的文档转换/预览服务,本文介绍其中的预览原理和使用方法。
7170 1
|
Linux 安全 Ubuntu
|
监控 前端开发
球机和云台的差别 以及他们的组成
    说的球机和云台的差别那不得不介绍球机和云台的概念了,球机全称为球型摄像机,是现代电视监控发展的代表,她集成彩色一体化摄像机、云台、解码器、防护罩等多功能与一体,安装方便、使用简单但功能强大,广泛应用于开阔区域的监控,不同的场合都可以使用。
5287 0
|
安全 Windows
修改windows系统文件权限
修改windows系统文件总是提示没有权限,虽然已是administrator也不管用。 以下方法可以解决: 右键属性,安全,高级,所有者,编辑,选择当前用户并确定, 回到上一页再确定, 然后在安全页面点编辑,添加,高级,立即查找,找到当前用户,并确定, 回到安全页面,选择当前用户,给予完全控制权限,最后确定, 以上操作就是把文件所有者设为当前用户,并且给予完全控制的权限。
1659 0
|
Java Android开发
Eclipse插件引入jar包的方法(转)
搞了两天,终于找到解决办法了。原来  Eclipse 插件项目引入外面的jar包不能用   build path---->add external jars的方法。     先说明两个概念:类加载器,OSGI 类加载器(class loader),顾名思义就是JVM用于加载类的一个工具。
1186 0
|
2月前
|
机器学习/深度学习 数据采集 人工智能
《大模型训练成本高,如何在不牺牲性能的前提下破局》
在人工智能领域,大模型训练成本高昂,主要源于硬件设备、数据处理和算法优化的需求。降低训练成本的关键在于合理配置硬件资源、改进数据处理方法、优化算法和模型结构,以及采用分布式训练技术。通过这些措施,企业可以在不影响模型性能的前提下,显著减少计算资源、人力和时间的投入,实现更高效的模型训练。实践证明,综合运用这些方法能够有效降低成本,推动人工智能技术的可持续发展。
198 18

热门文章

最新文章