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]