assert()断言用法总结

在C中,assert()实际是一个宏,它的定义在 assert.h 文件中

#include "assert.h" 
void assert( int expression );

编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,我们相信在程序中的某个特定位置该表达式值为。assert帮我们验证这个假设是不是成立,且不成立时,它会向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行.

assert的频繁使用会极大降低程序性能,所以在调试结束后,应禁用assert调用,方法为在#include的语句之前插入 #define NDEBUG:

#define NDEBUG
#include <assert.h>

用法总结和使用原则

1.在程序的开始处检验传入参数的合法性

例:

int resetBufferSize(int nNewSize)
{
  //功能:改变缓冲区大小,
  //参数:nNewSize 缓冲区新长度
  //返回值:缓冲区当前长度 
  //说明:保持原信息内容不变     nNewSize<=0表示清除缓冲区
  assert(nNewSize >= 0);
  assert(nNewSize <= MAX_BUFFER_SIZE);
  ...
}

2.每个assert应只检验一个条件

同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
如:

assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

无法判断两个表达式是哪个不成立

上述的语句应修改为:

assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);

3.不能使用改变环境的语句

assert只在DEBUG时生效,如果这么做,会使用程序在Release版本中遇到问题,如:

assert(i++ < 100);

这是因为如果出错,比如在执行之前i=100,那么i++这条命令就没有执行。

上述语句应修改为:

assert(i < 100);
i++;

4.assert和后面的语句应空一行,以形成逻辑和视觉上的一致感。

5.有的地方,assert不能代替条件过滤


参考资料:

[1].GLROY的天空. assert()函数用法总结[EB/OL]. [2017-01-06]. https://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html.

标签: C

发表评论: