assert 实现分析

发布时间:2016-12-6 8:10:41编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"assert 实现分析 ",主要涉及到assert 实现分析 方面的内容,对于assert 实现分析 感兴趣的同学可以参考一下。

assert 实现分析

一直以来,对于assert的实现总是不太理解,现在深入assert背后的代码,总算对assert的实现有了一个清醒的认识。

assert基于宏定义与宏展开实现。首先介绍一下assert的功能:它能够断言给定表达式是否为true。如果为true,则对应assert的代码会转换为static_cast<void>(0),即一条空语句,assert不执行任何操作,否则assert对应的代码会展开为__assert_fail (__STRING(expr), __FILE__, __LINE__, __func__)),使用expr参数,源代码名,assert所在的行数以及函数名调用__assert_fail函数,输出错误信息,并且因为断言出错而终止程序。请注意,在调用函数__assert_fail时,assert将传入的参数转换为字符串输入,这一点只需查看__STRING(x)的定义:#define __STRING(x) #x即可明白。

我们知道,在编译源代码的时候,如果我们定义了NDEBUG,那么assert不会起任何作用,哪怕传入的参数为false,这是为什么呢?因为在assert外层还有一个宏判断语句,如果定义了NDEBG,那么assert语句统一转换成static_void<void>(0)进行处理,所以不会对传入的参数进行任何判断。

下面附上相关代码,相信你现在会对assert有更加清晰的认识!

// (为了便于阅读,代码进行了部分修改)#define __STRING(x) #x#ifdef NDEBUG# define assert(expr)       (static_cast<void>(0))#else# define assert(expr)                           \  ((expr)                               \    ?static_cast<void>(0)                       \   : __assert_fail (__STRING(expr), __FILE__, __LINE__, __func__))#endif


上一篇:使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题
下一篇:Unity3D研究院编辑器之脚本设置ToolBar

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款