zoukankan      html  css  js  c++  java
  • <assert.h>库学习

    assert的初步认识

    assert宏指令是用来诊断程序是否有误的,函数原型如下

    void assert(int expression)

         那为什么我们要使用assert而不用printf呢?因为assert可以帮我们监测出是哪个条件不满足了,而且可以直观地显示出是代码中的哪一行出问题了,并且,当我们不打算用assert来诊断程序的时候,可以很方便地通过宏定义#define NDEBUG 取消assert的诊断。相比于自己写一个一个printf,自己判断程序哪一行出错,显然assert更有优势。

        其实assert的时候很简单,因为他的使用就跟if一样,assert(expression);expression其实就相当于if里面的表达式。来一段代码

    #include <assert.h>
    int main(){
        int i=0;
        assert(i>0);            //这里我们故意让assert不成立看看结果
        printf("打印出i的值是:%d
    ",i);       //看看是否能执行到这一步
        return 0;
    }

    运行结果:

    image

                                                         图1 运行结果

    从程序里面看出,我们可以直观地看出哪一行出错了,并且是条件’i>0’不成立出错的;并且当assert诊断出错后,程序就退出了。这在调试的时候很有用,但是当实际投入使用的时候,我们就要把assert(expression)诊断函数禁用掉,毕竟稳定性很重要。我们可以很方便地在文件头加上宏定义#define NDEBUG 取消assert的诊断。

    #define NDEBUG
    #include <assert.h>

    注意:#define NDEBUG要在#include <assert.h>之前,不然禁用assert不会成功。运行结果如图2.

    image

                                   图2 禁用assert之后

    可以看出,即使条件不成立,也不会再有assert的诊断信息了。并且很执行到printf那行。

    assert的进一步讨论

        当assert诊断失败后,assert会向stderr打印消息。从图1可以看出,assert诊断信息的表达形式是:Assertion failed: 表达式(expression),程序(file) 出错的文件名(file name), 行号(line nnn)。然后,asset会调用abort中断函数的执行,源代码的文件名(The Source filename)和行号(line number)定义在预处理宏(preprocessor macros)__FILE__ 和 __LINE__中。

    关于assert的用法总结与注意事项,点此

    参考

    《The C Programming Language》

  • 相关阅读:
    CodeForces 288A Polo the Penguin and Strings (水题)
    CodeForces 289B Polo the Penguin and Matrix (数学,中位数)
    CodeForces 289A Polo the Penguin and Segments (水题)
    CodeForces 540C Ice Cave (BFS)
    网站后台模板
    雅图CAD
    mbps
    WCF学习-协议绑定
    数据库建表经验总结
    资源位置
  • 原文地址:https://www.cnblogs.com/kissazi2/p/3142864.html
Copyright © 2011-2022 走看看