C 语言assert使用

一、assert宏的原型定义在<assert.h>中,其做用是若是它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>
void assert( int expression );程序员

      assert的做用是现计算表达式 expression ,若是其值为假(即为0),那么它先向stderr打印一条出错信息,而后经过调用 abort 来终止程序运行。express

 

二、使用assert的缺点是,频繁的调用会极大的影响程序的性能,增长额外的开销。在调试结束后,能够经过在包含#include <assert.h>的语句以前插入 #define NDEBUG 来禁用assert调用,示例代码以下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>编程

 

三、一些建议:函数

3.一、使用断言捕捉不该该发生的非法状况。不要混淆非法状况与错误状况之间的区别,后者是必然存在的而且是必定要做出处理的。
3.二、在函数的入口处,使用断言检查参数的有效性(合法性)。
3.三、在编写函数时,要进行反复的考查,而且自问:“我打算作哪些假定?”一旦肯定了的假定,就要使用断言对假定进行检查。
3.四、通常教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,若是“不可能发生”的事情的确发生了,则要使用断言进行报警。性能

 

四、一个例子:设计

char   *   clone_string(const   char   *   source)调试

{内存

        char   *   result;原型

        assert(source   !=   NULL);string

        result   =   (char   *)malloc(strlen(source)   +   1);

        if   (result   !=   NULL)

        {

            strcpy(result,   source);

            assert(strcmp(result,   source)   ==   0);

        }

        return   result;

}

    注意到我对source是否为NULL是用assert检查的,但对result是否是为NULL是用if语句判断的,这是由于在调用代码正确的状况下source必然不为NULL,若是断言失败,说明调用代码中有错误,须要修改;但result做为malloc的返回值则不必定,在malloc代码无误的状况下仍然可能返回NULL——当内存块不足时。最后又用assert对strcpy的结果进行检查,由于只要代码正确,不管什么状况strcpy应该正常完成复制,它没有malloc那种异常状况存在。

相关文章
相关标签/搜索