assert函数应用
1 assert概念
函数名:assert
头文件:#include<assert.h>
函数原形:void assert( int expression )
2 assert作用
assert的作用是先计算expression表达式的值,如果计算结果为真,继续运行下面的程序;如果计算结果为假,则程序终止运行。
assert函数主要是检测程序的未知错误。比如对指针操作时指针是否为NULL;某个变量是否符合预定范围等等
3 assert用法
3.1 检测调用者传过来的指针参数是否正常
void test(int* p)
{
assert(p != NULL);//用来判断调用者传过来的指针参数是否为空
/*函数体*/
}
延伸:上面判断指针是否为空,前提条件是
1 定义指针时就要初始化为NULL,比如`int* p = NULL;`;
2 释放指针变量后也要把指针赋值为NULL,比如:
```
free(p);
p = NULL;
```
3.2 判断某个变量的范围
void test()
{
int i = 0;
/*
*对i的相关操作,假设i小于32为有效范围
*/
assert(i < 32);
/*继续关于i的操作*/
}
关于assert的使用,可以根据自己的需要使用在程序任何地方,用来检测程序的异常。但是,过多的使用asser函数,频繁调用会非常影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include <assert.h>
的语句之前插入 #define NDEBUG
来禁用assert调用,示例代码如下:
#include<stdio.h>
#define NDEBUG
#include<assert.h>
3.3 assert只检验一个地方
同时检验多个条件,如果出现断言错误,不能分辨出是哪个条件判断错误,比如:
//错误
assert(i < 32 && i + temp < i_max);
//正确
assert(i < 32);
assert(i + temp < i_max);
3.4 不能使用改变环境的语句
因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题,如:
//错误
assert(i++ < 32);
这是因为如果出错,比如在执行之前i=32,那么这条语句就不会执行,那么i++这条命令就没有执行。
//正确
assert(i < 32);
i++;
assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。