zoukankan      html  css  js  c++  java
  • 【C/C++ 】assert

      C 标准库的assert.h头文件提供了一个名为assert的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息。assert 的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向 stderr 打印一条出错信息,然后通过调用 abort 来终止程序运行。

      assert.h文件内容如下:

     1 //
     2 // assert.h
     3 //
     4 //      Copyright (c) Microsoft Corporation. All rights reserved.
     5 //
     6 // Defines the assert macro and related functionality.
     7 //
     8 #if defined _VCRT_BUILD && !defined _ASSERT_OK
     9     #error assert.h not for CRT internal use
    10 #endif
    11 
    12 #include <corecrt.h>
    13 
    14 _CRT_BEGIN_C_HEADER
    15 
    16 
    17 
    18 #undef assert
    19 //////////
    20 #ifdef NDEBUG
    21 
    22     #define assert(expression) ((void)0)
    23 
    24 #else
    25 
    26     _ACRTIMP void __cdecl _wassert(
    27         _In_z_ wchar_t const* _Message,
    28         _In_z_ wchar_t const* _File,
    29         _In_   unsigned       _Line
    30         );
    31 //////////
    32     #define assert(expression) (void)(                                                       
    33             (!!(expression)) ||                                                              
    34             (_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) 
    35         )
    36 
    37 #endif
    38 
    39 
    40 
    41 _CRT_END_C_HEADER

    使用及注意事项

     示例:

     1 // #define NDEBUG
     2 #include <cassert>
     3 #include <iostream>
     4 
     5 int main()
     6 {
     7     int i = 4;
     8     assert(i > 5);
     9     std::cout << "done" << std::endl;
    10     return 0;
    11 }

      结果:

      在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用。则示例输出结果:done。

     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不能代替条件过滤。

      assert是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的

      在编写函数时,要进行反复的考查,并且自问:"我打算做哪些假定?"一旦确定了的假定,就要使用断言对假定进行检查。

    参考  


      
    白菜菜白C/C++ assert()函数用法总结
     
  • 相关阅读:
    ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考
    ASP.NET Core 中文文档 第四章 MVC(3.1)视图概述
    ASP.NET Core 中文文档 第四章 MVC(2.3)格式化响应数据
    ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证
    ASP.NET Core 中文文档 第四章 MVC(2.1)模型绑定
    ASP.NET Core 中文文档 第四章 MVC(01)ASP.NET Core MVC 概览
    mysql 解除正在死锁的状态
    基于原生JS的jsonp方法的实现
    HTML 如何显示英文单、双引号
    win2008 r2 服务器php+mysql+sqlserver2008运行环境配置(从安装、优化、安全等)
  • 原文地址:https://www.cnblogs.com/chen-cs/p/13043777.html
Copyright © 2011-2022 走看看