zoukankan      html  css  js  c++  java
  • 断言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:UsershuashunliDesktopcncn.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
  • 相关阅读:
    W3C help
    css值解析
    css中的格式上下文Formatting Context
    css中绝对定位中的left和top属性
    事件模型
    程序员应该如何更有效率
    css的边偏移距离
    css插入框
    css中的whitespace属性
    源码安装nginx 方法二
  • 原文地址:https://www.cnblogs.com/1203ljh/p/4731268.html
Copyright © 2011-2022 走看看