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

相关文章
|
Java
Checkstyle
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来。 CheckStyle检验的主要内容 ·Javadoc注释 ·命名约定 ·标题 ·Import语句 ·体积大小 ·空白 ·修饰符 ·块 ·代码问题 ·类设计 ·混合检查(包括一些
1192 0
|
Java 程序员 Linux
Docker杀掉了容器?问题分析与解决过程全面复盘
复盘docker exec命令执行失败的问题的处理过程
1110 1
Docker杀掉了容器?问题分析与解决过程全面复盘
|
测试技术
软件测试培训机构推荐这柠檬班,不仅讲课风趣,老师还很负责
近些年企业对软件测试人员的需求急速增加,并因其门槛低、薪资高,所以不少人都想转行到测试行业。
605 0
软件测试培训机构推荐这柠檬班,不仅讲课风趣,老师还很负责
|
存储 API Android开发
Android 天气APP(十一)未来七天的天气预报、逐小时预报、UI优化
Android 天气APP(十一)未来七天的天气预报、逐小时预报、UI优化
473 0
Android 天气APP(十一)未来七天的天气预报、逐小时预报、UI优化
|
监控 安全 搜索推荐
网站后台数据被入侵篡改了如何解决
网站后台被黑客攻击了怎么办,最近接到一个客户的诉求反映说网站被攻击了后台数据总是被篡改和泄露,而且维持这个状况已经很长时间了,了解完才发现原来早期用的是thinkphp系统源码来搭建的网站,代码版本可以来说是非常古董的,而且后台漏洞非常的多,后面找了一个技术来解决这个问题,但是这个过程他又花了不少时间和钱,漏洞修完过段时间又被反反复复的篡改会员数据,于是他们干脆就改成了完全静态的网站,这个方法只能是治标不治本。
666 0
网站后台数据被入侵篡改了如何解决
|
搜索推荐
小技巧 - 如何在百度搜索到自己的网站(新站必看)?
小技巧 - 如何在百度搜索到自己的网站(新站必看)?
2103 0
小技巧 - 如何在百度搜索到自己的网站(新站必看)?
Future & CompleteFuture 实践总结
Future & CompleteFuture 实践总结
|
设计模式 运维 架构师
进大厂,到底需要掌握哪些核心技能?
很多小伙伴问我进大厂到底需要怎样的技术能力,经过几天的思考和总结,终于梳理出一份相对比较完整的技能清单,小伙伴们可以对照清单提前准备相关的技能,在平时的工作中注意积累和总结。只要在平时的工作中总结到位,对技术知其然,知其所以然,进大厂,是水到渠成的事情。接下来,我就简单的列举下,在我个人看来,进大厂需要的一些技能。当然,这次主要说的是Java技术栈。后面也会分享一些其他的技术栈(C++、运维、云原生已安排上了,后面发)。
469 0
进大厂,到底需要掌握哪些核心技能?
|
消息中间件 存储 Java
Kafka2.6.0发布——性能大幅提升
Kafka2.6.0发布——性能大幅提升
449 0