【 C 】assert.h 简明介绍
头文件<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 简明介绍相关推荐
- 微软MFC技术简明介绍
我是荔园微风,作为一名在IT界整整25年的老兵,今天来看一下微软MFC技术简明介绍 Visual C++ 与 MFC 微软公司于1992年上半年推出了C/C++ 7.0 产品时初次向世人介绍了MFC ...
- BetaFlight开源工程结构简明介绍
BetaFlight开源工程结构简明介绍 Step1 获取开源代码 开源代码版本 克隆开源代码 Step2 了解工程情况 支持模型类型:多旋翼&固定翼 支持特性&功能 安装&文 ...
- C 标准库 - assert.h
C 标准库 - <assert.h> 简介 C 标准库的 assert.h头文件提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息. 已定义的宏 a ...
- time.h 详细介绍
time.h 详细介绍 < ctime> (time.h)包含获得和使用日期和时间信息的函数的定义. 一.Macro constants(宏常量) CLOCKS_PER_SEC:滴答声/秒 ...
- C标准库assert.h实现
1.背景知识 头文件<assert.h>唯一的目的就是提供assert宏定义,可以在程序中关键的地方使用这个宏来进行断言.如果一处断言被证明非真,希望程序在标准错误流输出一条适当的提示信息 ...
- c语言标准库assert,C 标准库 - assert.h
assert.h是c标准库的一个头文件,该头文件的主要目的就是提供一个assert的宏定义. assert只是对所给的表达式求值,就像if判断语句中一样,然后如果该值为真则正常运行,否则报错,并调用a ...
- 简明介绍java“包”的用法
简明介绍java"包"的用法 1. "包"的建立 "包"与文件夹对应,例如:package yanwu与文件夹yanwu对应. 程序wuha ...
- assert.h库学习
assert的初步认识 assert宏指令是用来诊断程序是否有误的,函数原型如下 void assert(int expression) 那为什么我们要使用assert而不用printf呢?因为ass ...
- C 标准库—— assert.h
C 标准库-- string.h C 标准库 -- time.h C 标准库 -- limits.h C 标准库 -- stdio.h C 标准库-- stdlib.h(包括 rand srand 的 ...
最新文章
- englis translate,word
- Linux 下使用命令行查看 內核版本 | 系統版本 | cpu 位數 | 內存使用
- HTML5培训教程学习之动效制作
- ClickHouse 副本协同原理:ReplicatedMergeTree引擎
- html css 表头,css固定表格表头(各浏览器通用)
- code review手记3
- TokenInsight:反映区块链行业整体表现的TI指数较昨日同期下降3.29%
- partition 子句_SQL PARTITION BY子句概述
- 构建入门Restful Web服务
- Mysql GROUP_CONCAT 使用注意事项
- 计算机操作系统笔记(三)
- 力胜机器人_德男子两手臂尺寸悬殊 超粗右臂曾力胜掰手腕机器人
- Hive内部表和外部表的区别详解
- 小程序跳转样式布局错乱_微信小程序页面布局问题
- 项目管理:项目质量管理
- c语言如何将十六进制转化为二进制数,C语言--将十进制整数转化为二进制与十六进制输出...
- 天刀 服务器状态,天刀实用技巧_天刀各种游戏小技巧_玩游戏网
- pdf文件如何在安卓手机端不用下载在线预览
- java回忆录—神奇的进制世界
- 图论总结(欧拉路+Floyd所有结点最短+Bellman-Ford算法+SPFA+Dijsktra算法+Tarjan算法+最小生成树(prim+kruskal) )
热门文章
- android 调用手机震动
- ASP.NET 数据分页第三篇 - 结合 Custom Control 处理 GridView 的 UI 呈现
- 转:ASP.NET程序中常用小技巧
- dragsort html拖拽排序 的应用
- 公司 表名规则 TN基础表 TR关系表 TL定义表
- b区计算机考研招不满的大学,B区又一所院校招收大量调剂!一志愿不满!
- HTML5column属性布局页脚,利用column多列属性调整页面文字列布局
- shell 引号 解析 逗号_关于shell的单引号和双引号转义 以及特殊符号相关
- idea添加maven libraries_使用IntelliJ IDEA创建一个Maven的Spring Boot项目
- java使用Jxl和Poi读写Excel