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

    摘自http://www.cplusplus.com

    assert : macro 

    #include <assert.h>
    void assert (int expression); 
    

      

      如果表达式值为0(即假),这时会向std::cerr设备发送一条信息,同时abort被调用,程序终止运行。

      向std::cerr发送的信息内容取决与具体的库实现,但至少应包括以下内容:引起assert判断为错误的表达式,源文件的名称,源代码中具体的位置(行数);通常表达规范如下:

        Assertion failed : expression file filename line line number

      如果名为NDEBUG的宏在此之前就已经定义好了,即使包含了<assert.h>文件,assert宏仍会失效。这会给程序员一些便利:在编写源代码并调试程序时可以使用任意多的  assert来查找问题,但在程序发布时可以在头部添加NODEBUG宏来使assert失效,简便了许多:

        将 #define NODEBUG 放在代码的开头并且在包含<assert.h>之前

      因此,assert宏是用来捕捉程序错误的,而并非用户或者运行时的错误(不知道怎么翻译,用户错误应该是程序逻辑错误,但是程序本身时正确可编译运行的。运行时的错误不太理解,此处应该是假设运行程序时使用了NODEBUG,强调调试采用assert,实际上程序运行还是可以用assert宏的),因为在退出调试模式后assert通常就失效了也就是说,assert只在debug时才生效。

    参数:表达式

      如果表达式值为0,则产生 assert 失败信息,从而终止程序运行

    返回值:

      无

    总结

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

      2)assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销,所以在程序完成后使用NODEBUG宏禁止assert

      3)不能使用改变环境的语句,因为assert只在DEBUG中生效,如果这么做,会使用程序在真正运行时遇到问题

    assert(i++ < 100);//这时如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行
    

      4)assert不能代替条件过滤。assert是用来避免显而易见的错误的,而不是处理异常的。错误和异常是不一样的,错误是不应该出现的,异常是不可避免的。c语言异常可以通过条件判断来处理,其它语言有各自的异常处理机制。一个非常简单的使用assert的规律就是,在方法或者函数的最开始使用,如果在方法的中间使用则需要慎重考虑是否是应该的。方法的最开始还没开始一个功能过程,在一个功能过程执行中出现的问题几乎都是异常。

      5) 程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。断言assert 是仅在Debug 版本起作用的宏,它用于检查“不应该”发生的情况。ASSERT只有在Debug版本中才有效,如果程序编译为Release版本则被忽略


      




  • 相关阅读:
    CF149D Coloring Brackets
    CF508D
    CF483C Diverse Permutation
    【纪念】我写过几乎最长的代码
    .net core图片上传详解
    layui插件croppers的使用
    关于日常操作中sql的性能
    leeCode 278
    leeCode刷题 1078
    leeCode刷题 lc184
  • 原文地址:https://www.cnblogs.com/Atanisi/p/7538088.html
Copyright © 2011-2022 走看看