assert的进一步分析

来源:互联网 发布:联通e是什么网络 编辑:程序博客网 时间:2024/05/22 03:29
数据结构之assert():
本质:
接受一个int类型的参数返回一个void类型的结果的函数。
用法:
#include<assert.h>
void assert(exp());//若exp()为真,则程序正常继续执行,为exp()为假,则它先向标准错误流stderr打印一条出错信息,然后通过调用系统函数来终止程序运行;(abort()函数来终止程序)。


      使用断言可以创建更稳定,品质更好且不易于出错的代码。当需要在一个值为FALSE时中断操作的话,可以使用断言。
       除了类型检查和单元测试外,断言还提供了一种确定各种特性是否在程序中得到维护的极好的方法。


    使用断言使向按契约式设计更近了一步。


断言只有在Debug模式下才有效。


注意点:


断言的副作用是因为它修改了程序中变量的值并且未抛出错误,这样的错误如果不细心的检查是很难发现的。但是同时可以根据以上的副作用得到一个有用的特性,根据它来测试断言是否打开。(bool  is Enable=false; //...       assert is Enable=true;)


assert是宏,而不是函数。在C语言库文件#include<assert.h>中;


  assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:


  #include <assert.h>


  void assert( int expression );


  assert的作用是先计算表达式expression,如果其值为假(即为0),那么它先向标准错误流(stderr)打印一条出错信息,然后通过调用abort来终止程序运行;否则,assert()无任何作用。宏assert()一般用于确认程序的正常操作,其中表达式构造无错时才为真值。完成调试后,不必从源代码中删除assert()语句,因为宏Debug有定义时,宏assert()的定义为空


缺点:


多次使用会导致程序的性能,会增大开销。assert()函数不能使用改变环境的语句


例:


assert(!i++);//在判断i++不为零时,应该把i++放在外面执行,因为assert只在Debug模式下起作用,在其他版本可能被注释,导致源代码评测变得困难。