怎样获得一个能报告条件失败的程序?
在任何一个程序中,有些情况是永远不应该出现的,例如除数为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()命令的代码运行起来要快得多,并且程序也不会因为某个变量轻微越界而突然停止运行。
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()命令的代码运行起来要快得多,并且程序也不会因为某个变量轻微越界而突然停止运行。