zoukankan      html  css  js  c++  java
  • C语言-断言

    1 作用:

      断言常做语言处理的高级形式,自动处理软件隐藏很深其且它手段不易发现的错误,快速进行异常定位。同时这也是软件单元测试必须的技术。

    2 使用范围:

      2.1放在函数入口对入口参数进行合法性检查(这也是我们经常看到的)

      2.1将assert(0)放在预计正常情况不会出现的地方(一旦出现肯定是异常出错了)

      2.3放在前置条件必须满足、后置条件必须满足、不变条件必须满足的场合

    3 使用原则:

      3.1一个断言只能检测一个条件。

      3.2 断言检查只是辅助条件,不能替代条件检测

      3.3 不能使用改变环境语句的使用。

      3.4可以用开关条件编译来打开或者关闭断言,一般在debug模式打开而在release模式下关闭。

          ifndef NDEBUG
                  assert( conditon ) ;
          #endif

      3.5频繁使用断言也会降低效率。并且它的强制停止所以不适合嵌入式程序和服务器,但也可以改写只报错误而不停止,即不调用abort()。

      3.6不要浪费别人的时间—详细说明不清楚的断言消除所做的隐式假定,或者利用断言检查其正确性例如:有时候我们会不自觉的认为一个字节占8位,或者说一个long型占据4个字节,这些都是对编译程序或操作系统做的一些假定。这使得我们需要在程序中使用断言例如ASSERT(sizeof(long)==4&&CHAR_BIT==8)。

      3.7断言是进行调试检查的简单方法。要使用断言来检查绝对不应该发生的非法情况,不要混淆非法情况和错误情况,错误情况是需要在最终产品中处理的。

      3.71利用断言对函数的参数进行确认,并且当程序员使用了无定义特性时向程序员报警。

      3.72当编写函数时,应反复问自己做了哪些假定,一旦确定了相应的假定,就要使用断言对所做的假定进行检验,或者重新编写代码去除假定。

     4静态断言与普通断言:

    静态断言可以在编译时就对程序的错误做出判断,而普通断言只能在程序运行出现错误的时候做出退出并产生调试信息
    static_assert(condition,string_condition);
    第一次参数是表达式,第二个参数是输出的信息
    static_assert()是C++ 新增的内容
    在C语言里可以这样实现:

    #define JOIN( X , Y ) JOIN_AGIN( X, Y )
     
    #define JOIN_AGIN(X,Y) X##Y
     
    typedef static_assert(e)
     
              typedef char JOIN(assert_failed_at_line,__LINE___) [(e)?1:-1]

      

  • 相关阅读:
    base64是什么东东,base64 图片显示,在线编辑器
    中文字符 与 十六进制Unicode编码 相互转换
    全面理解Python中self的用法
    Python之使用元类MetaClass
    Python之MySQL数据库连接驱动aiomysql的使用
    Python实战网站开发:Day2编写Web App骨架
    Python实战网站开发:Day3编写ORM
    Python之MySQL数据库连接驱动pymysql的使用
    【CV基础】为什么一些深度学习的图像预处理使用mean=[0.485, 0.456, 0.406] and std=[0.229, 0.224, 0.225]来正则化?
    与人合作创业是一门大艺术(转)
  • 原文地址:https://www.cnblogs.com/jieruishu/p/3896778.html
Copyright © 2011-2022 走看看