assert

转载 2010年05月25日 22:06:00


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不能代替条件过滤

Java会四分五裂吗?

Java会四分五裂吗?  从某些方面可以说,对Java的反响使我不禁回想起十年前烽火连天的Unix大战:强大的巨型公司手中攥着大量的市场碎片,这些碎片是他们的“诺亚方舟”。那时逐鹿中原,为的是问鼎一个...
  • Virtual
  • Virtual
  • 2000-12-27 09:08:00
  • 816

问题: 什么是ASSERT()? ASSERT()和assert()的区别是什么?

ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断...
  • procedurecode
  • procedurecode
  • 2007-12-16 16:17:00
  • 3681

VC开发慎用ASSERT

在VC开发过程中,我们会经常使用系统定义的一些宏来帮助我们做调试判断,其中有我们十分常用的TRACE和ASSERT这两个宏。但是,这两个宏一定需要慎用,之前在接手别人的代码时,就因为ASSERT而导致...
  • helinlin007
  • helinlin007
  • 2016-01-20 21:38:51
  • 3002

linux___assert()___函数操作

这个assert函数一直在心里有个结,没有好好的理清楚,今天有时间,看明白一些,做下笔记,如下。(注,例子是从网上找的,自己加以修改后测试)/*说明: assert 其值为假(即为0),那么它先向s...
  • zz460833359
  • zz460833359
  • 2016-07-17 23:30:58
  • 944

VS调试技巧——assert()函数的使用

在大学的时候看老师曾经使用assert函数来调试程序,今天想起,觉得可以了解一下assert函数的用法 主要用于捕捉程序的异常 assert宏的用法:转自http://blog.csdn.net/d...
  • lynnucas
  • lynnucas
  • 2016-05-03 15:21:58
  • 1114

Assert 在Java和Groovy中的区别

对于防御性编程而言,assert一直都是非常重要的工具。但对于熟悉-ea参数的Java程序员而言,当他们看到所有Groovy断言无论是否有-ea都照样执行时一定会非常困惑。事实上,Groovy的断言是...
  • hiarcs
  • hiarcs
  • 2010-04-26 11:38:00
  • 4225

assert()语法讲解

使用方法: assert (expression). 解释: 断言,当其中包含的表达式判断为假的时候,程序执行中断。 使用规则: 一般用于函数开头用于判断输入参数是否满足某种条件,和...
  • zhengxiuyudawang
  • zhengxiuyudawang
  • 2016-08-26 11:06:00
  • 569

集成电路中的assert和deassert应该如何翻译?

集成电路的数据手册中经常出现assert和deassert二个单词,有很多人把assert译成"断言",但是我觉得译为"有效"更为符合实际.deassert译为"无效".     例如:某数据手...
  • code_robot
  • code_robot
  • 2014-07-10 20:09:33
  • 1488

注意:assert在release版本中仍可生效

assert在程序的release版本中仍然有效(不要与VC中的ASSERT混淆),要使assert失效,只有在包含assert头文件(assert.h)的语句前定义NDEBUG宏或在编译器参数中添加...
  • yeyuboy
  • yeyuboy
  • 2006-02-07 16:58:00
  • 12338

浅谈 if和assert的区别

浅谈 if和assert的区别
  • My_heart_
  • My_heart_
  • 2016-05-14 12:32:31
  • 2168
收藏助手
不良信息举报
您举报文章:assert
举报原因:
原因补充:

(最多只允许输入30个字)