ASSERT函数

assert宏的原型定义在<assert.h>中,其作用是假设它的条件返回错误,则终止程序运行,原型定义: 
#include <assert.h> 
void assert( int expression ); 

assert的作用是现计算表达式 expression ,假设其值为假(即为0),那么它先向stderr打印一条出错信息, 
然后通过调用 abort 来终止程序执行。 

http://www.chongtang.me/index.php/1419

提高程序健壮性之assert使用

编写能正常执行的程序非常难;编写在错误情况下仍然表现的非常“优雅”的程序更难。这篇文章将和大家讨论一些编程技巧,能够使我们在执行中的程序中早点发现错误,检測和从问题中恢复。那就先讨论下断言(assert)的使用吧。

在编码时,有一个好的目标应该时刻铭记在心,那就是:应该想办法让bug或者异常错误尽早使得程序down掉,或者出现错误。由于这样能够帮助你在开发和測试阶段尽快找出bug。有一些错误不会无缘无故的暴露自己,往往是产品都到了客户手上,这些错误才会显现出来。

一个最简单的检查异常条件的方法是使用标准C的assert宏,它的參数是一个bool表达式。当表达式为假时,程序会退出。在退出之前打印错误消息,包含源文件,行号,和表达式本身。断言很实用,它提供了一个作用于程序内部的广泛的一致性检查方法。比如,使用断言測试函数參数的有效性,測试异常的返回值等等。

每个断言的使用不仅提供了一个程序执行时的条件检查,也像一个对源码级别的程序操作的说明性文档。假设你的程序包括了一个断言,也就是告诉那些阅读你源码的人,在你的源码中,在程序的这一点,这个条件应该为真,假设不为真,那就是一个bug。

当然,在追求性能的代码中,使用assert会减少程序性能。可是你放心,在编译时增加NDEBUG參数编译器就能够对assert进行预处理,从而移除它。正由于在预处理时可能移除assert,那你使用时就得小心了。什么时候用,什么时候不用就成了一个问题。通常,你不应该在assert内部调用函数,定义变量,或者使用改变值的操作符,如++。

我们如果你这样使用了:

for (i = 0; i &lt;= 100; ++i) assert (do_something () == 0);

然后,你可能会发现这样会使得性能大大减少,从而在创新编译使使用NDEGUG參数。这将移除整个assert宏,这就将do_something( )也被移除了,再也不被调用。为了纠正错误,你应该这样写:

for (i = 0; i &lt;= 100; ++i) { int status = do_something (); assert (status == 0); }

另外应该铭记在心的是,不要用assert去检查无效的输入。用户可不喜欢自己在输入时程序直接退出,即便是输入错误,程序最好也有友好的响应。所以,你应该对无效输入进行检查,并输出一些实用的提示信息。仅仅在程序执行中进行内部检查时使用断言。

在这里,我会给出一些比較好的在程序中使用assert的地方:

(1)空指针检查。比如,针对一个函数的參数进行空指针检查。你能够这样使用:assert (pointer != NULL);,产生的错误会像这样:Assertion ‘pointer != ((void *)0)’ failed。这样,当出现空指针时,你的程序就会退出,并不是常好的给出错误信息。

(2)检查函数參数的值。比如,假设一个函数仅仅能在它的一个參数foo为正值的时候被调用,你能够在函数開始时这样写:assert (foo > 0);,这将帮助你检測函数的错误使用,这也给源码阅读者非常清晰的印象,那就是在这里对函数的參数值有限制。

说了这么多,行动起来吧,大胆的在你的程序中使用断言。


http://www.programfan.com/blog/article.asp?id=10284

---------------------------------------------------------------   

ASSERT()是一个调试程序时常常使用的宏,在程序运行时它计算括号内的表达式,假设表达式为FALSE  (0),  程序将报告错误,并终止运行。假设表达式不为0,则继续运行后面的语句。这个宏通常原来推断程序中是否出现了明显非法的数据,假设出现了终止程序以免导致严重后果,同一时候也便于查找错误。   

ASSERT仅仅有在Debug版本号中才有效,假设编译为Release版本号则被忽略。   
---------------------------------------------------------------   

ASSERT宏定义例如以下   

#define  ASSERT(f)  \   
do  \   
{  \   
      if  (!(f)  &&  AfxAssertFailedLine(THIS_FILE,  __LINE__))  \   
              AfxDebugBreak();  \   
}  while  (0)  \   

ASSERT(逻辑表达式)   

假设括号里的逻辑表达式值为假的话,会弹出调试命令窗体,提示详细在哪个文件的哪一行发生了断言错误!   
---------------------------------------------------------------   

ASSERT   
Evaluates  an  expression,  and  displays  a  diagnostic  message  if  the  expression  is  FALSE.  Ignored  in  retail  builds.   

Syntax   

ASSERT(   
      cond   
);   

Parameters   

cond   

Expression  to  evaluate.   

Remarks   

In  debug  builds,  if  the  expression  is  FALSE,  this  macro  displays  a  message  box  with  the  text  of  the  expression,  the  name  of  the  source  file,  and  the  line  number.  The  user  can  ignore  the  assertion,  enter  the  debugger,  or  quit  the  application.   

Example   

ASSERT(rtStartTime  <=  rtEndTime);   


---------------------------------------------------------------   

断言(ASSERT)的使用,方法非常easy。为什么要用,刚開始学习的人可能比較迷惑。   
契约式编程讲的比較清楚,建议能够先看看这类书。   
一个函数由前置条件、后置条件和不变式组成。在VC中,我们能够通过断言来保证这三个条件。能够大大提高了软件的质量。   
---------------------------------------------------------------   

假设ASSERT()中的条件不成立(比方  ASSERT(0)  ;    ),会弹出一个比較吓人的对话框。   

点击重试,能够到达  ASSERT  断言不成立的那一行,   

此时能够在watch窗体查看变量值,找出出错的原因。   

转载于:https://www.cnblogs.com/mengfanrong/p/4088126.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx 反向proxy多个 tomcat,负载均衡

负载均衡一&#xff0c;正向proxy与反向proxynginx二&#xff0c;nginx安装三&#xff0c;nginx负载均衡场景四&#xff0c;配置nginx访问代理多个tomcat一&#xff0c;正向proxy与反向proxynginx 正向proxy 正向proxy返向proxy nginx 客户端发送请求到服务器&#xff08;客户…

Jquery想说爱你不容易

JQuery是一套跨浏览器的JavaScript库&#xff0c;简化HTML与JavaScript之间的操作。由John Resig在2006年1月的BarCamp NYC上发布第一个版本。目前是由 Dave Methvin 领导的开发团队进行开发。全球前10000个访问最高的网站中&#xff0c;有59%使用了jQuery&#xff0c;是目前最…

android-波浪效果ripple-background

能产生波浪效果的背景图片控件&#xff0c;可以自定义颜色&#xff0c;波浪扩展的速度&#xff0c;波浪的圈数。运行效果&#xff1a; 下载地址&#xff1a;http://jcodecraeer.com/a/opensource/2014/1110/1946.html转载于:https://www.cnblogs.com/noodlesonce/p/4090163.htm…

仔细学习CSS(一)

推荐编辑器&#xff1a;Notepad (under Windows), TextEdit (on the Mac) or KEdit (under KDE)&#xff1b; Style Master, Dreamweaver or GoLive For HTML and CSS, we want simple, plain text files. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">…

容器数据卷

容器数据卷技术 它是一种将容器中的数据持久化到linux宿主机的技术。 # 1. 使用命令挂载 -v docker run -it -v 主机目录:容器目录# 将容器centos 的home目录挂载到linux的用户docker_study/centos_home目录下面 [rootizbp1imy docker_study]# docker run -it -v /usr/e…

对contentoffset的理解

今天遇到一个问题&#xff0c;在写瀑布流时&#xff0c;竖屏的时候可以正常实现&#xff0c;在手机变成横屏后&#xff0c;总是显示不全。 最终查了两个小时&#xff0c;查到了导致这个的原因&#xff0c;是自己的判断cell是否在当前显示区域的方法写错了。 根本原因是没有很好…

微信开发小程序

小程序开发工具win10下载地址 官方文档地址 学了一下小程序&#xff0c;… 虽然目前小程序用得少&#xff0c;本人。但是回家买票还是有用小程序的。 小程序开发不难&#xff0c;会三件套html&#xff0c; css &#xff0c;js 就行了。如果你会vue就更快了。它就是一套前端项目…

DockerFile构建

dockerfiletodo item基础命令编写dockefiel基于centos镜像制作tomcatjdk的镜像todo item 是用来构建docker镜像的脚本&#xff1b;命令参数脚本。构建步骤:1、编写一个dockerfile文件2、 docker build 构建为一个镜像3、docker run 运行镜像4、docker push 发布镜像(dockerhub…

Linux:jumpserver V3的安装与升级(在线离线)(2)

官方文档写的非常详细&#xff0c;我这篇文章时间长了&#xff0c;会随着官方版本更新而落后 JumpServer - 开源堡垒机 - 官网https://www.jumpserver.org/安装和升级在官网也有详细的信息&#xff0c;我写本章是为了记录一下实验 我的系统是centos7.9 在线安装 在确定我们可…

redis 学习笔记(1)-编译、启动、停止

一、下载、编译 redis是以源码方式发行的&#xff0c;先下载源码&#xff0c;然后在linux下编译 1.1 http://www.redis.io/download 先到这里下载Stable稳定版&#xff0c;目前最新版本是2.8.17 1.2 上传到linux&#xff0c;然后运行以下命令解压 tar xzf redis-2.8.17.tar.gz …

微信小程序 调用地图接口,实现定位

1. demo01.wxml <!-- 定位 --> <view><button type"default" bindtap"get_location">get position</button></view><view><map id"my_map" latitude"{{latitude}}" longitude"{{longitu…

【ASP.NET】获取网站目录的方法

获取网站物理路径: HttpRuntime.AppDomainAppPath获取网站虚拟路径: HttpRuntime.AppDomainAppVirtualPath转载于:https://www.cnblogs.com/chenguoxingblog/p/4107771.html

如何使用div优雅的布局

flex布局方式1&#xff0c;float飘起来~方式2&#xff0c;使用flex&#xff0c;将多个div合并到一行就是跨行和跨列嘛…如果表格做就easy…但是, div是块级标签&#xff0c;每个div会独占一行…方式1&#xff0c;float飘起来~ 下面的两个div会到一行… <div> <div s…

多行文本溢出问题

总结了一些网上看到的&#xff0c;结合自己的思考&#xff0c;举例如下&#xff1a; http://jssl915.github.io/overflow.html 转载于:https://www.cnblogs.com/lj915/p/4112840.html