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();
    }

  • 相关阅读:
    疫情环境下的网络学习笔记 python 5.8 数据库入门终章
    疫情环境下的网络学习笔记 python 5.7 navicat数据库,例题,sql注入
    疫情环境下的网络学习笔记 python 5.6 暂时看看
    疫情环境下的网络学习笔记 python 5.5 MYSql 表关系,外键
    疫情环境下的网络学习笔记 python 5.4 数据库基础
    疫情环境下的网络学习笔记 python 4.30 初识数据库
    疫情环境下的网络学习笔记 python 4.29 网络小项目
    XJOI 夏令营501-511测试11 游戏
    XJOI 夏令营501-511测试11 统计方案
    CF1197D Yet Another Subarray Problem
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3476436.html
Copyright © 2011-2022 走看看