断言assert的用法

1.首先明确assert实质上是宏,原型定义在<assert.h>中,作用是如果expression返回错误,则先向stderr打印一条出错信息,然后调用abort来终止程序的运行;

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

#include <assert.h>
void assert( int expression );
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main( void )
{
       FILE *fp;

       fp = fopen( "test.txt", "w" );          //以可写的方式打开一个文件,如果不存在就创建一个同名文件
       assert( fp );                           //所以这里不会出错
       fclose( fp );

       fp = fopen( "noexitfile.txt", "r" );    //以只读的方式打开一个文件,如果不存在就打开文件失败
       assert( fp );                           //所以这里出错
       fclose( fp );                           //程序永远都执行不到这里来
       return 0;
}

运行结果:Assertion failed: fp, file C:\Users\huashunli\Desktop\cn\cn.cpp, line 13

 

2.另外可以根据测试时的DEBUG版本和部署时的RELEASE版本决定启用或是禁用断言验证;在调试结束后,可以通过在#include <assert.h>前插入#define NDEBUG来禁用assert,形式如下:

#include ...
#define NDEBUG
#include <assert.h>
#include ...

 

3.用法总结和注意事项:

(1)在函数开始处检验传入参数的合法性,如:

int resetBufferSize(int nNewSize) 
{ 
    //功能:改变缓冲区大小, 
    //参数:nNewSize 缓冲区新长度 
    //返回值:缓冲区当前长度 
    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);  // BETTER

(3)不能在assert中使用改变环境的语句,也就是不能因为assert的使用而改变程序结构;

assert(i++ < 100)              // WRONG

assert(i < 100) i++;           // RIGHT

posted on 2015-08-14 21:32  huashunli  阅读(287)  评论(0编辑  收藏  举报

导航