c++函数设计变量的合法性使用断言



在函数 或 代码 前后 判断参数 或 变量的合法性

方法:使用断言 assert

作用:用来检查一些必须符合的条件,捕捉 “不应该” 发生的非法情况,如果不符合条件,则不让程序继续运行下去。

使用时间 &  位置:

前置条件断言:代码执行之前 或 在函数的入口处,使用断言检查 参数 的合法性。

断言执行:表示调用者出错了

后置条件断言:代码执行之后 或 在函数的出口处,使用断言检查 参数 是否正确执行

断言执行:表示代码执行完后,参数的值 出现了 不可能出现的值

前后不变断言:代码执行前后 或 在函数的入出口处,使用断言检查参数是否发生变化

断言执行:表示 执行某些代码后,变量值被修改了

怎么使用:

在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?(参数在哪种情况下是有意义的)” 一旦确定了的假定,就要使用断言对假定进行检查。

什么时候使用断言:

1.可以在正常情况下 程序不会到达的地方放置断言

2.断言可以用于 检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)

3.使用断言测试方法执行的前置条件和后置条件

4.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)

什么地方不要使用断言:

1.不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行

2.断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值.

[cpp] view plaincopy


  1. 错误用法:
  2. assert(i++ < 100)
  3. 原因:i++只能在debug下执行,release下不会执行,这就导致在两种环境下运行结果不同
  4. 正确用法:
  5. assert(i < 100)
  6. i++;

语法:

[cpp] view plaincopy

  1. assert(表达式);
  2. 表达式的值 表示 正确的情况
  3. 即,”我断言,XXX是真地”
  4. 使用这个宏前需要包含头文件assert.h
  5. 如果表达式的值为假,整个程序将退出,并输出一条错误信息
  6. 如果表达式的值为真,则继续执行后面的语句

注意事项:

1、使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

因此,在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用

2、每个assert语句只检验一个条件。因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

[cpp] view plaincopy

  1. 不推荐使用
  2. assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
  3. 推荐使用
  4. assert(nOffset >= 0);
  5. assert(nOffset+nSize <= m_nInfomationSize);