在函数 或 代码 前后 判断参数 或 变量的合法性
方法:使用断言 assert
作用:用来检查一些必须符合的条件,捕捉 "不应该" 发生的非法情况,如果不符合条件,则不让程序继续运行下去。
使用时间 & 位置:
前置条件断言:代码执行之前 或 在函数的入口处,使用断言检查 参数 的合法性。
断言执行:表示调用者出错了
后置条件断言:代码执行之后 或 在函数的出口处,使用断言检查 参数 是否正确执行
断言执行:表示代码执行完后,参数的值 出现了 不可能出现的值
前后不变断言:代码执行前后 或 在函数的入出口处,使用断言检查参数是否发生变化
断言执行:表示 执行某些代码后,变量值被修改了
怎么使用:
在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?(参数在哪种情况下是有意义的)” 一旦确定了的假定,就要使用断言对假定进行检查。
什么时候使用断言:
1.可以在正常情况下 程序不会到达的地方放置断言
2.断言可以用于 检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)
3.使用断言测试方法执行的前置条件和后置条件
4.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)
什么地方不要使用断言:
1.不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行
2.断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值.
错误用法:
assert(i++ < 100)
原因:i++只能在debug下执行,release下不会执行,这就导致在两种环境下运行结果不同
正确用法:
assert(i < 100)
i++;
语法:
assert(表达式);
表达式的值 表示 正确的情况
即,"我断言,XXX是真地"
使用这个宏前需要包含头文件assert.h
如果表达式的值为假,整个程序将退出,并输出一条错误信息
如果表达式的值为真,则继续执行后面的语句
注意事项:
1、使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
因此,在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用
2、每个assert语句只检验一个条件。因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
不推荐使用
assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
推荐使用
assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);