头文件<assert.h>唯一的目的就是提供assert宏定义,可以在程序中关键的地方使用这个宏来进行断言。如果一处断言被证明非真,希望程序在标准错误流输出一条适当的提示信息,并使执行异常终止。

它的原型如下:

void assert( int expression );

当它被执行时,这个宏对表达式参数进行测试。如果它的值为假(0),它就向标准错误打印一条诊断信息并终止程序。这条信息的格式是由编译器定义的,但它将包含这个表示式和源文件的名字以及断言所在的行号。(后面会给出具有案例) 如果表达式为真,它将不打印任何东西,程序继续执行。

注:由于assert()不是一个函数而是一个宏,所以assert实际上并不具有原型,但是,这个原型可以形象的说明assert的用法。

这个宏提供了一个方便的方法,对应该是真的东西进行检查。例如,一个函数必须用一个不能为 NULL 的指针参数进行调用,那么函数可以用assert验证这个值:

assert( value != NULL );

如果函数错误的接受了一个 NULL 参数,程序将会打印一条类似下面的信息:

Assertion failed: value != NULL, file.c line 274

提示:用这种方法使用assert使调试变得更容易,因为一旦出现错误,程序就会停止。而且,这条信息准确地提示了症状出现的地点。如果没有断言,程序可能继续执行,并在以后失败,这就很难调试了。

注意 assert 只适用于验证必须为真的表达式。由于它会终止程序,所以你无法用它检查那些你试图进行处理的情况,例如检查非法的输入并要求用户重新输入一个值。

当程序被完整地测试完毕之后,你可以在编译时通过定义 NDEBUG 消除所有的 assert. 你可以在源文件的头文件中 assert.h 被包含之前增加下面这个定义:

#define NDEBUG

当NDEBUG 被定义之后,预处理器将丢弃所有的 assert,这样就消除了这方面的开销,而不必在源文件中把所有的assert实际删除!

(可以通过在程序的某些地方定义宏NDEBUG来改变assert的展开方式

如果程序某个包含assert的地方没有定义NDEBUG,该头文件就会将宏assert定义为活动形式,它就可以展开为一个表达式,测试断言并在断言为假的时候输出一条错误信息,然后程序终止。反之,如果定义了NDEBUG,头文件就会把这个宏定义为不执行任何操作的静止形式。)

参考:《c与指针》

assert

【 C 】assert.h 简明介绍相关推荐

  1. 微软MFC技术简明介绍

    我是荔园微风,作为一名在IT界整整25年的老兵,今天来看一下微软MFC技术简明介绍 Visual C++ 与 MFC 微软公司于1992年上半年推出了C/C++ 7.0 产品时初次向世人介绍了MFC ...

  2. BetaFlight开源工程结构简明介绍

    BetaFlight开源工程结构简明介绍 Step1 获取开源代码 开源代码版本 克隆开源代码 Step2 了解工程情况 支持模型类型:多旋翼&固定翼 支持特性&功能 安装&文 ...

  3. C 标准库 - assert.h

    C 标准库 - <assert.h> 简介 C 标准库的 assert.h头文件提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息. 已定义的宏 a ...

  4. time.h 详细介绍

    time.h 详细介绍 < ctime> (time.h)包含获得和使用日期和时间信息的函数的定义. 一.Macro constants(宏常量) CLOCKS_PER_SEC:滴答声/秒 ...

  5. C标准库assert.h实现

    1.背景知识 头文件<assert.h>唯一的目的就是提供assert宏定义,可以在程序中关键的地方使用这个宏来进行断言.如果一处断言被证明非真,希望程序在标准错误流输出一条适当的提示信息 ...

  6. c语言标准库assert,C 标准库 - assert.h

    assert.h是c标准库的一个头文件,该头文件的主要目的就是提供一个assert的宏定义. assert只是对所给的表达式求值,就像if判断语句中一样,然后如果该值为真则正常运行,否则报错,并调用a ...

  7. 简明介绍java“包”的用法

    简明介绍java"包"的用法 1. "包"的建立 "包"与文件夹对应,例如:package yanwu与文件夹yanwu对应. 程序wuha ...

  8. assert.h库学习

    assert的初步认识 assert宏指令是用来诊断程序是否有误的,函数原型如下 void assert(int expression) 那为什么我们要使用assert而不用printf呢?因为ass ...

  9. C 标准库—— assert.h

    C 标准库-- string.h C 标准库 -- time.h C 标准库 -- limits.h C 标准库 -- stdio.h C 标准库-- stdlib.h(包括 rand srand 的 ...

最新文章

  1. englis translate,word
  2. Linux 下使用命令行查看 內核版本 | 系統版本 | cpu 位數 | 內存使用
  3. HTML5培训教程学习之动效制作
  4. ClickHouse 副本协同原理:ReplicatedMergeTree引擎
  5. html css 表头,css固定表格表头(各浏览器通用)
  6. code review手记3
  7. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期下降3.29%
  8. partition 子句_SQL PARTITION BY子句概述
  9. 构建入门Restful Web服务
  10. Mysql GROUP_CONCAT 使用注意事项
  11. 计算机操作系统笔记(三)
  12. 力胜机器人_德男子两手臂尺寸悬殊 超粗右臂曾力胜掰手腕机器人
  13. Hive内部表和外部表的区别详解
  14. 小程序跳转样式布局错乱_微信小程序页面布局问题
  15. 项目管理:项目质量管理
  16. c语言如何将十六进制转化为二进制数,C语言--将十进制整数转化为二进制与十六进制输出...
  17. 天刀 服务器状态,天刀实用技巧_天刀各种游戏小技巧_玩游戏网
  18. pdf文件如何在安卓手机端不用下载在线预览
  19. java回忆录—神奇的进制世界
  20. 图论总结(欧拉路+Floyd所有结点最短+Bellman-Ford算法+SPFA+Dijsktra算法+Tarjan算法+最小生成树(prim+kruskal) )

热门文章

  1. android 调用手机震动
  2. ASP.NET 数据分页第三篇 - 结合 Custom Control 处理 GridView 的 UI 呈现
  3. 转:ASP.NET程序中常用小技巧
  4. dragsort html拖拽排序 的应用
  5. 公司 表名规则 TN基础表 TR关系表 TL定义表
  6. b区计算机考研招不满的大学,B区又一所院校招收大量调剂!一志愿不满!
  7. HTML5column属性布局页脚,利用column多列属性调整页面文字列布局
  8. shell 引号 解析 逗号_关于shell的单引号和双引号转义 以及特殊符号相关
  9. idea添加maven libraries_使用IntelliJ IDEA创建一个Maven的Spring Boot项目
  10. java使用Jxl和Poi读写Excel