<assert.h>库学习
assert的初步认识
assert宏指令是用来诊断程序是否有误的,函数原型如下
void assert(int expression)
那为什么我们要使用assert而不用printf呢?因为assert可以帮我们监测出是哪个条件不满足了,而且可以直观地显示出是代码中的哪一行出问题了,并且,当我们不打算用assert来诊断程序的时候,可以很方便地通过宏定义#define NDEBUG 取消assert的诊断。相比于自己写一个一个printf,自己判断程序哪一行出错,显然assert更有优势。
其实assert的时候很简单,因为他的使用就跟if一样,assert(expression);expression其实就相当于if里面的表达式。来一段代码
#include <assert.h>
int main(){
int i=;
assert(i>); //这里我们故意让assert不成立看看结果
printf("打印出i的值是:%d\n",i); //看看是否能执行到这一步
return ;
}
运行结果:

图1 运行结果
从程序里面看出,我们可以直观地看出哪一行出错了,并且是条件’i>0’不成立出错的;并且当assert诊断出错后,程序就退出了。这在调试的时候很有用,但是当实际投入使用的时候,我们就要把assert(expression)诊断函数禁用掉,毕竟稳定性很重要。我们可以很方便地在文件头加上宏定义#define NDEBUG 取消assert的诊断。
#define NDEBUG
#include <assert.h>
注意:#define NDEBUG要在#include <assert.h>之前,不然禁用assert不会成功。运行结果如图2.

图2 禁用assert之后
可以看出,即使条件不成立,也不会再有assert的诊断信息了。并且很执行到printf那行。
assert的进一步讨论
当assert诊断失败后,assert会向stderr打印消息。从图1可以看出,assert诊断信息的表达形式是:Assertion failed: 表达式(expression),程序(file) 出错的文件名(file name), 行号(line nnn)。然后,asset会调用abort中断函数的执行,源代码的文件名(The Source filename)和行号(line number)定义在预处理宏(preprocessor macros)__FILE__ 和 __LINE__中。
关于assert的用法总结与注意事项,点此。
参考
《The C Programming Language》
<assert.h>库学习的更多相关文章
- 《C标准库》—之<assert.h>实现
首先,贴出标准库中<assert.h>的实现源码: #undef assert #ifdef NDEBUG #define assert(test)((void)0) #else void ...
- C 标准库系列之assert.h
先简单介绍一下<assert.h>头文件,该头文件的目的便是提供一个宏assert的定义,即可以在程序必要的地方使用其进行断言处理:断言在程序中的作用是当在调试模式下时,若程序给出的前提条 ...
- C标准库<assert.h>实现
本文地址:http://www.cnblogs.com/archimedes/p/c-library-assert.html,转载请注明源地址. 1.背景知识 头文件<assert.h>唯 ...
- 走进C标准库(1)——assert.h,ctype.h
默默觉得原来的阅读笔记的名字太土了,改了个名字,叫做走进C标准库. 自己就是菜鸟一只,第一次具体看C标准库,文章参杂了对<the standard C library>的阅读和对源码的一些 ...
- C 标准库 - <assert.h>
C 标准库 - <assert.h> 简介 C 标准库的 assert.h头文件提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息. 已定义的宏 a ...
- dlib库学习之一
dlib库学习之一 1.介绍 跨平台 C++ 通用库 Dlib 发布 ,带来了一些新特性,包括概率 CKY 解析器,使用批量同步并行计算模型来创建应用的工具,新增两个聚合算法:中国低语 (Chines ...
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
- muduo网络库学习笔记(三)TimerQueue定时器队列
目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...
随机推荐
- ThinkPHP5调用PHPExcel类实现导入导出
注意:extend是放置第三方类的地方,不要乱配置命名空间那些,引起不必要的类错误 代码如下 <?php namespace app\index\controller; use think\Co ...
- 基于tcp的下载文件,以及struct模块的应用。
一 基于TCP的下载 客户端: from socket import * import os def main(): tcp_socket = socket(AF_INET, SOCK_STREAM) ...
- hdfs底层存储分隔符
字段分割 \ map字段里面key \ value \ 每行结尾用linux换行符 \0a '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格,通常敲一个回车键,即是回车,又是换行( ...
- js_字符转Unicode
在开发中总会遇到关于Unicode的转码和解码,每次都找工具转/解码很麻烦 ,今天在网上get到一个简单的转/解Unicode的函数. var UnicodeFun = { toUnicode: fu ...
- [Unity动画]01.HasExitTime & ApplyRootMotion
参考链接: https://www.cnblogs.com/hammerc/p/4828774.html 资源下载: https://assetstore.unity.com/packages/ess ...
- centos 虚拟环境 安装mezzanine cms
[root@hai envdj]# cd bin [root@hai bin]# activate -bash: activate: command not found [root@hai bin]# ...
- idea 添加代码自动提示支持,已PHP扩展 swoole 为例
1,下载代码支持包 => swoole-ide-helper-en => https://github.com/eaglewu/swoole-ide-helper.git 2,如果安装了 ...
- jmap dump文件压缩后失效
最近线上出问题,于是用jmap -dump拿到dump文件,再linux压缩后拿到windows下无效,后来又直接拿了一个没有压缩的竟然可以用...坑啊!~
- offsetof使用小结
先上例子 #include <stdio.h> #include <stdlib.h> /* offsetof example */ #include <stddef.h ...
- node.js 爬虫动态代理ip
参考文章: https://andyliwr.github.io/2017/12/05/nodejs_spider_ip/ https://segmentfault.com/q/10100000081 ...