[学习标准库]assert.h

打算趁留在学校的最后一段时间好好补习一下一直以来都忽略掉的C/C++标准库,大概就是以头文件为单位了。以一个最简单的头文件入手,然后逐渐展开来……第一个头文件当然非assert.h莫属了。这个范例是i386-pc-mingw32中的GCC 4.5.0下包含的。

该头文件中给我们提供的东西是非常简单的,主要就是一个assert宏。对其功能与说明借引自《C++函数库查询辞典》中的描述如下:

cpp;collapse:true;;gutter:false; /* * assert.h * This file has no copyright assigned and is placed in the Public Domain.</p> <ul> <li> <p>This file is a part of the mingw-runtime package.</p> </li> <li> <p>No warranty is given; refer to the file DISCLAIMER within the package.</p> </li> </ul> <p>* * Define the assert macro for debug output.</p> <p>* */</p> <p>/<em> We should be able to include this file multiple times to allow the assert macro to be enabled/disabled for different parts of code. So don't add a header guard. </em>/</p> <h1>ifndef RC_INVOKED</h1> <p>/<em> All the headers include this file. </em>/</p> <h1>include</h1> <h1>undef assert</h1> <h1>ifdef __cplusplus</h1> <p>extern "C" {</p> <h1>endif</h1> <h1>ifdef NDEBUG</h1> <p>/* * If not debugging, assert does nothing.</p> <p>*/</p> <h1>define assert(x) ((void)0)</h1> <h1>else /<em> debugging enabled </em>/</h1> <p>/* * CRTDLL nicely supplies a function which does the actual output and * call to abort.</p> <p><em>/ _CRTIMP void __cdecl __MINGW_NOTHROW _assert (const char</em>, const char*, int) __MINGW_ATTRIB_NORETURN;</p> <p>/* * Definition of the assert macro.</p> <p>*/</p> <h1>define assert(e) ((e) ? (void)0 : _assert(#e, <strong>FILE</strong>, <strong>LINE</strong>))</h1> <h1>endif /<em> NDEBUG </em>/</h1> <h1>ifdef __cplusplus</h1> <p>}</p> <h1>endif</h1> <h1>endif /<em> Not RC_INVOKED </em>/</h1> <pre><code> 说明: assert宏能测试传入表达式的真假值,当表达式为真(true),则不会有任何反应;当表达式为假(false),则函数将输出错误信息,并中断程序的执行。 功能: assert宏可以用来判断某表达式的真假值,并在程序执行的过程中实时响应错误信息,因此在程序开发的过程中,常常被用来作程序纠错的工具,当程序开发完成,只需要在加载头文件前面,利用#define指令定义NDEBUG这个关键字,则所有assert都会失效,源程序不需做任何修改。 当传入的表达式为真,则assert不会有任何响应;当表达式为假时,assert函数会显示出发生错误的表达式、源代码文件名以及发生错误的程序代码行数,并调用abort函数,结束程序执行。 使用范例: ;gutter:false;
// #define NDEBUG // don’t use assert
#include
#include
int main()
{
int i = 0;
std::cout << "before assert(i==0)" << std::endl;
assert(i==0);
std::cout << "before assert(i==1)" << std::endl;
assert(i==1);
std::cout << "after assert(i==1)" << std::endl;
return 0;
}

此程序最后产生的输出为:
C:\WINDOWS\system32\cmd.exe /c a.exe

before assert(i==0)

before assert(i==1)

Assertion failed: i==1, file test.cpp, line 11This application has requested the Runtime to terminate it in an unusual way.Please contact the application’s support team for more information.

shell returned 3

Hit any key to close this window…

如此一来,其起作用的时机及功能就比较清晰了。

Original: https://www.cnblogs.com/mazhuang/archive/2009/12/30/assert_h.html
Author: mzlogin
Title: [学习标准库]assert.h

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/572796/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 股票获取最大利润

    1、题目背景 给定一个数组 prices,它的第i个元素prices[i]表示一支给定股票第i天的价格,你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票,设计…

    Java 2023年6月8日
    073
  • iphone 开发学习笔记七

    本篇算是该系列最后一篇,虽不能说是很熟,但使用MonoTouch 开发的其本方法是掌握了,主要是完成当初的任务,实现地图开发包在iPhone上的实现。使用MonoTouch ,.N…

    Java 2023年5月29日
    053
  • MVCC原理

    MVCC MVCC (Multi-Version Concurrency Control) ,即多版本并发控制,利用记录的版本链和ReadView,来控制并发事务访问相同记录时的行…

    Java 2023年6月6日
    081
  • Java中使用FTPClient上传下载

    在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件、下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包…

    Java 2023年5月29日
    085
  • OO第四单元&课程总总结

    OO第四单元&课程总总结 时刻提醒自己不能跑题完结撒花 OO第四单元&课程总总结 架构介绍 + 类图 顺序图 状态图 关于算法 设计思维 与 OO理解演进 封装与解…

    Java 2023年6月13日
    080
  • Java架构师学习路线思维导图+Java基础+Java常用技术思维导图

    最近浏览保存的一些比较详细的思维导图,大家感兴趣可下载阅读。 Java架构师学习路线思维导图 链接: _ https://www.processon.com/view/link/5…

    Java 2023年5月29日
    0106
  • 记一次线上MySQL数据库死锁问题

    最近线上项目报了一个MySQL死锁(DealLock)错误,虽说对业务上是没有什么影响的,由于自己对数据库锁这块了解不是很多,之前也没怎么的在线上碰到过。这次刚好遇到了,便在此记录…

    Java 2023年6月7日
    071
  • MyBatis拦截器

    MyBatis拦截器的作用是在于Dao到DB中间进行额外的处理。大部分情况下通过mybatis的xml配置sql都可以达到想要的DB操作效果,然而存在一些类似或者相同的查询条件或者…

    Java 2023年6月7日
    077
  • 多线程、Handler机制、ThreadLocal

    Thread 线程状态:新建(new),就绪(start),运行(run),阻塞,死亡 start 方法内部调用了 run 方法,start 会开启线程,run 只是内部方法; s…

    Java 2023年6月7日
    063
  • 多线程(线程组【ThreadGroup】)

    线程组: 把多个线程组合到一起。* 它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。 生产者和消费者之等待唤醒机制的代码优化 线程实现类—设置和获取…

    Java 2023年6月5日
    080
  • Windows JDK 的下载与安装

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月6日
    075
  • ReadWriteLock读写锁

    ReadWriteLock读写锁 概念: 读写锁:存在着两个锁,一个 &#x8BFB;&#x9501;&#xFF08;&#x5171;&#x…

    Java 2023年6月5日
    082
  • RPC学习—-Thrift快速入门和Java简单示例

    一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术…

    Java 2023年5月29日
    086
  • 排序算法(1)

    所谓排序,就是按照某种规律把一组对象重新进行排列的过程。日常工作中,比如excel表格中,很多时候都要按照某种规律进行排序。因此,排序是所有应用中非常基础的一部分。首先作为对排序算…

    Java 2023年6月5日
    083
  • MYSQL进阶

    之前写了篇文章, 记录了MySQL的一些常用命令, 现在看来仍然有遗漏的地方, 所以补充一下 组合查询 即 UNION 使用 UNION来组合两个查询,如果第一个查询返回 M 行,…

    Java 2023年6月7日
    0108
  • Java Date 和 Calendar 实例

    Java 之 Date 和 Calendar 实例 package com.homer.learn; import java.text.DateFormat; import jav…

    Java 2023年5月29日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球