zoukankan      html  css  js  c++  java
  • 关于断言——assert

    函数名: assert
    功 能: 测试一个条件并可能使程序终止
    用 法: void assert(int test);
    程序例:
    #include <assert.h>
    #include <stdio.h>
    #include <stdlib.h>

    struct ITEM {
    int key;
    int value;
    };

    /* add item to list, make sure list is not null */
    void additem(struct ITEM *itemptr) {
    assert(itemptr != NULL);
    /* add item to list */
    }

    int main(void)
    {
    additem(NULL);
    return 0;
    }
    assert(断言)可以有两种形式:
    assert Expression1 ;
    assert Expression1 : Expression2 ;
    Expression1 应该总是产生一个布尔值。
    Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
    断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
    javac -source 1.4 Test.java
    要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
    要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
    要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
    可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。

    assert() 函数用法
    assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
    #include <assert.h>
    void assert( int expression );
    assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
    然后通过调用 abort 来终止程序运行。
    请看下面的程序清单badptr.c:
    #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;
    }
    [root@localhost error_process]# gcc badptr.c
    [root@localhost error_process]# ./a.out
    a.out: badptr.c:14: main: Assertion `fp' failed.
    已放弃
    使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
    在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
    #include <stdio.h>
    #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个生效,如果这么做,会使用程序在真正运行时遇到问题
    错误: assert(i++ < 100)
    这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。
    正确: assert(i < 100)
    i++;


    4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感
    5)有的地方,assert不能代替条件过滤

    ---------------------------------------------------------
    在switch语句中总是要有default子句来显示信息(Assert)。   
       
      int   number     =   SomeMethod();     
       
      switch(number)     
       
      {     
       
            case   1:     
       
                  Trace.WriteLine("Case   1:");     
       
                  break;     
       
            case   2:     
       
                  Trace.WriteLine("Case   2:");     
       
                  break;     
       
            default   :     
       
                  Debug.Assert(false);     
       
                  break;     
       
      }     
       
  • 相关阅读:
    You are not late! You are not early!
    在同一个服务器(同一个IP)为不同域名绑定的免费SSL证书
    Vue.js Is Good, but Is It Better Than Angular or React?
    It was not possible to find any compatible framework version
    VS增加插件 Supercharger破解教程
    Git使用ssh key
    Disconnected: No supported authentication methods available (server sent: publickey)
    VS 2013打开.edmx文件时报类型转换异常
    asp.net MVC4 框架揭秘 读书笔记系列3
    asp.net MVC4 框架揭秘 读书笔记系列2
  • 原文地址:https://www.cnblogs.com/buffer/p/1276167.html
Copyright © 2011-2022 走看看