1、可以在预计正常情况下程序不会到达的地方放置断言。(如assert (0);)
2、使用断言测试方法执行的前置条件和后置条件 。
3、使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如某个变量的变化范围)
对于上面的前置条件和后置条件可能有的读者还不是很了解,那么看看下面的解释你就明白了。
前置条件断言:代码执行之前必须具备的特性
后置条件断言:代码执行之后必须具备的特性
前后不变断言:代码执行前后不能变化的特性
当然在使用的断言的过程中会有一些我们应该注意的事项和养成一些良好的习惯,如:
1、每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,我们就无法直观的判断是哪个条件失败
2、不能使用改变环境的语句,就像我们上面的代码改变了i变量,在实际编写代码的过程中是不能这样做的
3、assert和后面的语句应空一行,以形成逻辑和视觉上的一致感,也算是一种良好的编程习惯吧,让编写的代码有一种视觉上的美感
4、有的地方,assert不能代替条件过滤
5、放在函数参数的入口处检查传入参数的合法性
6、断言语句不可以有任何边界效应
上面那么多的文字,似乎很枯燥,但是没办法,我们不能急功近利,还是要先坚持看完文字描述部分,这样在下面我们分析代码的过程中就能很快知道为什么会出现那样的问题了,也能在自己编写代码的时候熟练的使用assert,给自己的代码调试带来极大的便利,尤其是你在用C语言做工程项目的时候,如果你能够在你的代码中合理的使用assert,能使你创建更稳定、质量更好且不易于出错的代码。当需要在一个值为FALSE时中断当前操作的话,可以使用断言。单元测试必须使用断言,除了类型检查和单元测试外,断言还提供了一种确定各种特性是否在程序中得到维护的极好的方法。但凡优秀的程序员都能够在自己代码中很好的使用assert,编写出高质量的代码来。
说了assert这么多的有点,当然也要说说它的缺点了。
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。所以在调试结束后,可以通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用。
接下面分析一下下面的一段代码:
#include <stdio.h> int copy_string(char from[],char to[]) printf("%s\n",to); return 1; int main() printf("%s\n",str); assert(copy_string(str,dec_str)); printf("%s\n",dec_str); return 0; |
运行结果为: