zoukankan      html  css  js  c++  java
  • 关于assert的学习

    编写代码时,总会做出一些假设,断言就是用于在代码中捕捉这些假设,
    可以将断言看成是异常处理的一种高级形式。
    c语言assert宏的定义,
    #include <assert.h>
    void assert(int expression);
    意思就是断言表达式expression为真。
    如果expression表达式的结果为假,则向stderr打印出错信息并调用abort来终止程序运行。

    #undef assert
    #ifdef NDEBUG
    #define assert(expression) ((void)0)
    #else
    #define _STR(x)  _VAL(x)
    #define _VAL(x)  #x
    #define assert(expression) ((expression)?(void)0:_assert(__FILE__ ":" _STR(__LINE__) " " #expression))
    #endif

    使用assert宏时应该要注意:assert只有在debug版本中才生效;在release版本中应该什么都不做。
    所谓debug版本,就是程序员调试所使用的版本,这个版本会输出更多的日志信息以便于调试bug;
    所谓release版本就是最终交付给客户或用户使用的版本。
    通常在用户功能层面来看,debug版本和release版本应该是一样的;
    但是release版本因为更高级的优化、更好的日志输出等,所以release版本的程序执行效率会更高。
    所以通常使用类似于如下的方式来定义用户自己的assert宏,
    #ifdef DEBUG
    #define ASSERT(expression) xxx
    #else
    #define ASSERT(expression) ((void)0)
    #endif

    当我们认为某个表达式不可能为真的时候,就可以使用assert来判定。
    assert可以用来检查指针的有效性、参数的合法性等。
    使用assert可以帮助程序员在程序开发阶段就能够尽早的发现错误。

    使用assert的一点主意事项:
    expression应该足够简单,不要同时检查多个条件,
    这样当assert失败时,可以明确的知道哪个条件失败了。

    如果assert失败了呢?这个时候程序要怎么执行?
    所以光有assert还不够,还要做好程序的出错处理,只有这样写出来的程序才是稳定的健壮的。

    以下是一个简单的除法操作案例。
    在除法操作中,必须要检查的一件事就是被除数不能为0,否则会发生算术错误。
    使用assert,可以帮助程序员在debug版本中查到错误;
    release版本中,除了要做被除数检查外,还要做好被除数为0时的出错处理。
    因为y=0并不是预期的值,所以即使有了处理处理程序,仍然需要进一步查找y=0的原因。
    只有找到了真正的错误根源,并且进行修复,才能进一步提高软件的品质。
    int x = 100;
    int y = 0;
    int sum = 0;

    y = get_devide();
    assert(y != 0);
    if (y != 0)
    {
        sum = x / y;
    }
    else
    {
        printf(" error, y=0, please to check the reason");
        do_error_handling();
    }

  • 相关阅读:
    isNUll ,对于sql中的一个表的description的NULL和空格的处理
    Thread类学习
    java学习计划
    HTTP请求过程(http是一种无状态协议,即不建立持久的连接)
    JS事件流(W3C与IE区别)
    学习Javascript闭包
    div内长串数字或字母不断行处理
    仿购物车加减数字
    多行文字两行断尾点点点显示
    MegaCli命令详解
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3476436.html
Copyright © 2011-2022 走看看