随笔- 16  评论- 2  文章- 0 

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和后面的语句应空一行,以形成逻辑和视觉上的一致感。

参考:assert()函数用法总结

posted on 2019-05-01 00:10 shell_nut 阅读(...) 评论(...) 编辑 收藏