您当前的位置:首页 > 计算机 > 编程开发 > C语言

怎样获得一个能报告条件失败的程序?

时间:01-03来源:作者:点击数:

在任何一个程序中,有些情况是永远不应该出现的,例如除数为O,给空指针赋值,等等。当这些情况出现时,程序应该能立即给出报告,并且还应该能报告发生错误的位置。

c语言提供了assert()命令,它能帮助你解决这个问题。assert()命令会检查它的括号中的条件,如果该条件失败,它会执行以下几步:
         (1)打印失败条件的内容;
         (2)打印发生错误的行号;
         (3)打印错误所在的源文件名;
         (4)使程序以出错状态结束。

简单地说,assert()命令的作用就是保证那些不应出现的情况不会出现。下面将给出一些这样的条件的例子。

内存分配失败是最常见的问题之一,在确实需要内存空间却又无法得到的情况下,程序只好退出。利用assert()命令可以很好地解决这个问题:

foo()
{
      char  * buffer;
      buffer = malloc( 10000 );
      assert ( buffer |= NULL );
}

如果buffer等于NULL,程序将停止执行,并且报告这个错误以及发生错误的位置;否则程序将继续执行。

下面是assert()命令的另一种用法:

float IntFracC int Num, int Denom )
{
     assert( Denom ! = 0 ) ;
     return  ( ( float ) Num  ) / ( ( float ) Denom );
}

这里用assert()命令防止在程序中把O作为除数。

应该强调的是,只有在条件失败会导致灾难性的后果时,才需要使用assert()命令。如果有可能,程序员应该用更好的方法来处理这类错误。在前面的例子中,除数为O的可能性可能很小,但这并不意味着assert()命令就没有用。一个设计良好的程序应该有很多assert()命令,因为知道将要发生灾难性结果毕竟比一无所知(或不愿知道)要好得多。

使用assert()命令的另一个好处是通过在程序的头部加入宏NDEBUG(不调试),就可以使所有的assert()命令在编译时被忽略掉。当所有的错误都被修正后,这一点对于生成不同版本的程序是非常重要的。如果加入NDEBUG宏定义,就能生成不含调试代码的可执行程序,你可以向用户发放这种版本;而删去NDEBUG宏定义后又能生成含调试代码的可执行程序,你可以保留这种版本供自己使用。不含assert()命令的代码运行起来要快得多,并且程序也不会因为某个变量轻微越界而突然停止运行。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门