函数assert()详解
函数assert()详解:
断言assert是一个宏,该宏在<assert>中,,当使用assert时候,给他个参数,即一个判读为真的表达式。预处理器产生测试该断言的代码,如果断言不为真,则发出一个错误信息告诉断言是什么以及它失败一会,程序会终止。
我们一般可以用在判断某件操作是否成功上。
摘录林锐博士高质量编程一书中相关内容。
~~~~~~~~~~~~~~~~~~~~
程序一般分为Debug版本和Release版本,Debug版本用于内部调试,Release版本发行给用户使用。
断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况。以下是一个内存复制程序,在运行过程中,如果assert的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。
//复制不重叠的内存块
void memcpy(void *pvTo, void *pvFrom, size_t size)
{
void pbTo = (byte ) pvTo;
void pbFrom = (byte ) pvFrom;
assert( pvTo != NULL && pvFrom != NULL );
while(size - - > 0 )
*pbTo + + = *pbFrom + + ;
return (pvTo);
}
assert不是一个仓促拼凑起来的宏,为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。所以assert不是函数,而是宏。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。
以下是使用断言的几个原则:
1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
2)使用断言对函数的参数进行确认。
3)在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。
参考来源:
https://zhidao.baidu.com/question/201080430.html
函数assert()详解相关推荐
- python getopt_python 5种 statsPython中的getopt函数使用详解
函数原型: getopt.getopt(args, shortopts, longopts=[]) 参数解释: args:args为需要解析的参数列表.一般使用sys.argv[1:],这样可以过滤掉 ...
- C语言 -- string.h中函数功能详解与手动实现 - 02(常用函数memcpy、memmove、strcpy、strdup、strcat、strtok...)
内容预览 3.5.搬迁类型 --- 函数功能详细说明 :将内存空间中内容移动.复制到另一内存空间 3.6.搬迁类型 --- 函数功能测试与手动实现 3.6.1.memcpy.memccpy 3.6.2 ...
- ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...
- R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表
R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据
- R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表
R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表
- R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
R语言tidyr包Unite()函数实战详解:多个数据列合并为一列 目录 R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
- R语言tidyr包separate()函数实战详解:一列裂变为多列
R语言tidyr包separate()函数实战详解:一列裂变为多列 目录 R语言tidyr包separate()函数实战详解:一列裂变为多列 一列裂变为两列
- C++中substr()函数用法详解
C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...
- LayoutInflater的inflate函数用法详解
LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...
- python中subplot是什么意思_python matplotlib中的subplot函数使用详解
python里面的matplotlib.pylot是大家比较常用的,功能也还不错的一个包.基本框架比较简单,但是做一个功能完善且比较好看整洁的图,免不了要网上查找一些函数.于是,为了节省时间,可以一劳 ...
最新文章
- Nginx负载均衡之TCP端口高可用(二)
- 如何重构“箭头型”代码
- 【网络】TCP基础总结
- @Data 注解对类静态字段, 无效
- Android 控件布局常用属性
- 处理selinux方法
- Taran 缩点【bzoj1529】[POI2005]ska Piggy banks
- android tible控件_android自定义表单,表格控件TableRowTextView
- Java 8 map(),flatMap()示例
- java 如何让循环结束,跳过某个条件,跳出当前的多重嵌套循环
- 在计算机网络中发送电子邮件遵循的协议是,一、计算机网络刷题
- python深拷贝_python 深拷贝与浅拷贝的区别
- 云计算实战系列十二(Linux系统优化)
- 苹果手机mov文件如何复制到电脑_如何在手机上访问电脑上的文件(超详细步骤) iPhone版...
- matlab s函数模板,MATLAB第5章S函数.ppt
- PuTTY 私钥'putty/sshdss.c' 多个信息泄露漏洞
- Linux_MySQL下(4) 未整理
- 对抗机器学习—— 迭代FGSM
- 微信带参二维码数据解析
- python 自动发送微信消息 (win)
热门文章
- 认知智能再突破,阿里 18 篇论文入选 AI 顶会 KDD
- 如何用Neo4j和Scikit-Learn做机器学习任务?| 附超详细分步教程
- 全球首个软硬件推理平台 :NVDLA编译器正式开源
- MediaPipe:Google Research 开源的跨平台多媒体机器学习模型应用框架
- 自动驾驶行业观察 | 停车不再难,L2到L4的泊车辅助系统技术剖析
- AI黑科技:呵护地球,我们是认真的
- Arm 发布Mali多媒体套件,机器学习将不再是高端手机的专享
- IntelliJ IDEA 2021.3.2 发布:告别不断建议安装xx插件的提示!
- 聊一聊如何优雅地向程序员提问题
- Spring Boot第四篇:SpringBoot 整合JPA