摘自http://www.cplusplus.com

assert : macro

#include <assert.h>
void assert (int expression);

  

  如果表达式值为0(即假),这时会向std::cerr设备发送一条信息,同时abort被调用,程序终止运行。

  向std::cerr发送的信息内容取决与具体的库实现,但至少应包括以下内容:引起assert判断为错误的表达式,源文件的名称,源代码中具体的位置(行数);通常表达规范如下:

    Assertion failed : expression file filename line line number

  如果名为NDEBUG的宏在此之前就已经定义好了,即使包含了<assert.h>文件,assert宏仍会失效。这会给程序员一些便利:在编写源代码并调试程序时可以使用任意多的  assert来查找问题,但在程序发布时可以在头部添加NODEBUG宏来使assert失效,简便了许多:

    将 #define NODEBUG 放在代码的开头并且在包含<assert.h>之前

  因此,assert宏是用来捕捉程序错误的,而并非用户或者运行时的错误(不知道怎么翻译,用户错误应该是程序逻辑错误,但是程序本身时正确可编译运行的。运行时的错误不太理解,此处应该是假设运行程序时使用了NODEBUG,强调调试采用assert,实际上程序运行还是可以用assert宏的),因为在退出调试模式后assert通常就失效了也就是说,assert只在debug时才生效。

参数:表达式

  如果表达式值为0,则产生 assert 失败信息,从而终止程序运行

返回值:

  无

总结

  1)在函数开始处检验传入参数的合法性

  2)assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销,所以在程序完成后使用NODEBUG宏禁止assert

  3)不能使用改变环境的语句,因为assert只在DEBUG中生效,如果这么做,会使用程序在真正运行时遇到问题

assert(i++ < 100);//这时如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行

  4)assert不能代替条件过滤。assert是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的。c语言异常可以通过条件判断来处理,其它语言有各自的异常处理机制。一个非常简单的使用assert的规律就是,在方法或者函数的最开始使用,如果在方法的中间使用则需要慎重考虑是否是应该的。方法的最开始还没开始一个功能过程,在一个功能过程执行中出现的问题几乎都是异常。

  5) 程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。断言assert 是仅在Debug 版本起作用的宏,它用于检查“不应该”发生的情况。ASSERT只有在Debug版本中才有效,如果程序编译为Release版本则被忽略

  

【C/C++】assert的更多相关文章

  1. 【C/C++】assert()函数用法总结

    assert()函数用法总结 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> ...

  2. 【pytest系列】- assert断言的使用

    unittest断言方式是用过框架自己实现的,即self.assertEqual()等,当我们使用pytest框架后,这种断言方式是不可用的,因为测试类不会再继承unittest.TestCase类, ...

  3. 【php】assert函数的用法

    [php]assert函数的用法 http://www.douban.com/note/217557007/ 2012-06-01 10:32:37   assert这个函数在php语言中是用来判断一 ...

  4. 跟着老男孩教育学Python开发【第一篇】:初识Python

    Python简介 Python前世今生 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...

  5. Python之路3【第一篇】Python基础

    本节内容 Python简介 Python安装 第一个Python程序 编程语言的分类 Python简介 1.Python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum) ...

  6. Python开发【第一篇】:初识Python

    初识python 一.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...

  7. Python【第一章】:简介和入门

    ython简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承.之 ...

  8. Python之路【第一篇】:Python简介和入门

    python简介: 一.什么是python Python(英国发音:/ pa θ n/ 美国发音:/ pa θɑ n/),是一种面向对象.直译式的计算机程序语言. 每一门语言都有自己的哲学: pyth ...

  9. Python全栈开发【基础一】

    Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...

随机推荐

  1. spring BeanFactory加载xml配置文件示例

    项目目录结构如下: HelloWorld.java package com.thief.demo; public class HelloWorld { public void sayHello() { ...

  2. 线性同余方程组模板( x=r0(mod m0) )

    #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm& ...

  3. iOS 微信支付点击左上角返回解决方案

    在网了搜了一些解决方案,感觉并不是那么严谨,于是自己动手搞了一下,直接说思路 iOS调起第三方支付和安卓还不一样,安卓是把第三方的支付SDK直接镶嵌在自己的App中,而iOS由于沙盒机制,各个应用之间 ...

  4. mysql怎么在已建好的表中添加自增序列

     alter table 表明 change id id int not null auto_increment unique;

  5. python neo4j

    https://neo4j.com/developer/python/ http://debian.neo4j.org/

  6. Linux LVM管理

    创建和管理LVM 要创建一个LVM系统,一般需要经过以下步骤: 1. 创建分区 fdisk /dev/sdb 使用分区工具(如:fdisk等)创建LVM分区,方法和创建其他一般分区的方式是一样的,区别 ...

  7. mysql的binlog太多太大占用了空间的解决办法

    现象:网站访问越来越慢,最后无法访问了,经过检查发现磁盘满了 分析过程及解决方案:通常出现这种问题都应该登录服务器检查磁盘.内存和进程使用的情况,通过top.df –h和free –m来检查,发现磁盘 ...

  8. Ubuntu14 下安装jdk1.8

    1.oracle官网下载jdk-8u45-linux-i586.gz 此为32位 2.放在任意目录下,如/home/hongxf 3.直接解压该文件 sudo tar -xvf jdk-8u45-li ...

  9. 算法(Algorithms)第4版 练习 2.2.23

    测试结果: 算法(Algorithms)第4版 练习 2.2.10 算法(Algorithms)第4版 练习 2.2.11(1) 算法(Algorithms)第4版 练习 2.2.11(2) 算法(A ...

  10. QT 按键处理 快捷键处理 shift + ctrl

    原味地址:http://www.cnblogs.com/codingmylife/archive/2010/08/30/1812739.html CTRL+Enter发送信息的实现 在现在的即时聊天程 ...