C 标准库系列之assert.h
先简单介绍一下<assert.h>头文件,该头文件的目的便是提供一个宏assert的定义,即可以在程序必要的地方使用其进行断言处理;断言在程序中的作用是当在调试模式下时,
若程序给出的前提条件没有满足或是没有达到预期预定的条件便会出现断言为假,此时程序会异常终止,调试时会挂在该断言失败处(即结果为false的断言位置)并打印或者显示断言
失败的消息。
assert函数实际上是一个宏,glibc和微软的c标准库实现均是如此;如glibc的:
# define assert(expr) \
((expr) \
? __ASSERT_VOID_CAST (0) \
: __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
可以看到该宏实际上是通过三目运算符,判断表达式expr的真假,执行相应的处理,当为真是执行__ASSERT_VOID_CAST(0),该函数实际上也是一个宏;
即# define __ASSERT_VOID_CAST static_cast<void>,其实际上什么也没有做,此外__assert_fail函数便是用以打印断言失败的消息并终止的函数;该函数参数分别为断言表达式,
当前的文件路径名,当前行号,以及断言函数名;而这些参数通过相应的宏提供。
__assert_fail函数内部调用__assert_fail_base,其提供格式化打印输出,__assert_fail_base内部分配堆空间存储格式化后的信息,并调用__fxprintf以及fflush向stderr
标准输出刷字符串;此后便释放该分配的堆空间,并调用abort终止程序;微软的提供了类似的实现,不过其针对Unicode和多字节提供不同的实现方式,当为Unicode时,其assert宏
失败时调用_assert函数,同样的_assert函数内部调用_set_error_mode来控制设置输出,sprintf格式化错误信息,此后通过GetStdHandle(STD_ERROR_HANDLE)获取到错误输出设备
并调用WriteConsole向该错误输出设备输出字符串信息,此后同样调用abort来终止程序;而当为多字节模式时,便调用_ftprintf以及fflush向stderr标准输出刷字符串;
assert函数,其参数为int类型,故只要表达式可计算结果可以转化为int类型的均可。
assert断言仅在Debug模式下有效,对于发行Release或者NDEBUG模式下其宏声明类似于# define assert(expr) (__ASSERT_VOID_CAST (0))或者#define assert(ignore) ((void)0);
即什么也不做,也包括表达式的值也不会计算,这个一定要切记!此处若使用不当可能引入BUG,导致调式和开发模式下程序有不同的表现行为。
顺便提一下,abort函数也是C语言标准库stdlib.h中的一员。
此外C11中提供了static_assert宏,若编译器支持C11,则建议使用该宏来进行断言处理,此外此后的C语言标准库分析均暂时不针对C11的标准库。
C 标准库系列之assert.h的更多相关文章
- 《C标准库》—之<assert.h>实现
首先,贴出标准库中<assert.h>的实现源码: #undef assert #ifdef NDEBUG #define assert(test)((void)0) #else void ...
- C 标准库系列之locale.h
locale.h 区域设置相关,主要针对时间日期.货币格式.字符控制.数字格式等以满足某区域的设置需要. locale设置类别主要包括以下几个宏定义的类别: LC_ALL:设置所有的类别: LC_CO ...
- C 标准库系列之errno.h
errno.h 提供了一个整数全局变量errno,当系统调用或者库函数的错误事件发生时可能会修改该值,指明错误的原因,该值可在任何需要的地方被修改:一般情况不为0的值表示出现了异常或者错误. errn ...
- C 标准库系列之limits.h
limits.h 类似于float.h,其定义了一些列类型的值的范围.限制值,也就是说该类型的值不可以大于该上界或者小于该类型值的下界: glibc中宏定义了一下的值: # define MB_LEN ...
- C 标准库系列之float.h
float.h 内部主要包含了一系列的浮点数宏.指明可移植程序必要的常量:浮点数格式一般为Spxbe;其中S表示+-:p表示底数.b表示基数如2.8.10.16等进制,e为指数标识E或e: 在一般情况 ...
- C 标准库系列之ctype.h
ctype.h 主要提供了一些函数用以测试字符或字符处理的功能函数:包括字符判断检测.字符转换: 目前ASCII字符可分为以下一些类型,如:大写.小写.字母.数字.十六进制.空白字符.可打印字符.控制 ...
- C 标准库系列之概述
基本上很多编程语言都会提供针对语言本身的一系列的标准库或者包,当然C语言同样也有提供标准库,C语言的标准库是一系列的头文件的集合:如assert.h.ctype.h.errno.h.float.h.l ...
- 《C标准库》——之<ctype.h>
在没读<ctype.h>的源码之前,我一直以为我们平时用的isalnum.isdigit.isalpha等这些函数,是靠判断写出来的. 比如: int isdigit(int c){ re ...
- 《C标准库》——之<stddef.h>
<stddef.h>,顾名思义,就是标准定义.C语言里这个标准库里定义了一些类型,和宏定义. <stddef.h>的内容: 类型: ptrdiff_t : 是两个指针相减的结果 ...
随机推荐
- SQLServer------将表和内容导入到另一个数据库
转载: http://jingyan.baidu.com/article/d5c4b52bc5c102da570dc547.html
- 阿里云提示:对输入参数id未进行正确类型转义,导致整型注入的发生
类似以下提示: XXX.php中,对输入参数id未进行正确类型转义,导致整型注入的发生 解决办法: 找到对应文件:$id = $_GET['id']; 增加以下标红过滤: $id = $_GET['i ...
- 耗时两月,NHibernate系列出炉
写在前面 这篇总结本来是昨天要写的,可昨天大学班长来视察工作,多喝了点,回来就倒头就睡了,也就把这篇总结的文章拖到了今天. nhibernate系列从开始着手写,到现在前后耗费大概两个月的时间,通过总 ...
- 【IDEA 2016】intellij idea tomcat jsp 热部署
刚开始用IDEA,落伍的我,只是觉得IDEA好看.可以换界面.想法如此的low. 真是不太会用啊,弄好了tomcat.程序启动竟然改动一下就要重启,JSP页面也一样. IDEA可以配置热部署,打开to ...
- ELK 集中日志分析 windows部署实战
一步步来 1.下载软件 Elasticsearch: https://download.elasticsearch.org/...p/elasticsearch/2.0.0/elasticsearch ...
- fedora配置163为yum的源
一种方法: 1.下载 http://mirrors.163.com/.help/fedora-163.repo 和 http://mirrors.163.com/.help/fedora-updat ...
- ASP.NET 验证码控件
public class ValidateCode : WebControl { /// <summary> /// 默认构造函数,暴露的属性接口 /// </summary> ...
- SVN发布网站
1.问题 2.分析 如果机器先安装.NET framework,后安装IIS就会出现此问题,原因是.NET framework未注册. 3.注册.NET framework
- apache 配虚拟主机转发到tomcat
我用的是apache2.4.23, 连接tomcat使用自带的 proxy-ajp,需要开启相关模块 引用 http://www.server110.com/apache/201404/10273.h ...
- spring实例化bean的三种方式
公共使用的实体