C语言-断言
1 作用:
断言常做语言处理的高级形式,自动处理软件隐藏很深其且它手段不易发现的错误,快速进行异常定位。同时这也是软件单元测试必须的技术。
2 使用范围:
2.1放在函数入口对入口参数进行合法性检查(这也是我们经常看到的)
2.1将assert(0)放在预计正常情况不会出现的地方(一旦出现肯定是异常出错了)
2.3放在前置条件必须满足、后置条件必须满足、不变条件必须满足的场合
3 使用原则:
3.1一个断言只能检测一个条件。
3.2 断言检查只是辅助条件,不能替代条件检测
3.3 不能使用改变环境语句的使用。
3.4可以用开关条件编译来打开或者关闭断言,一般在debug模式打开而在release模式下关闭。
ifndef NDEBUG
assert( conditon ) ;
#endif
3.5频繁使用断言也会降低效率。并且它的强制停止所以不适合嵌入式程序和服务器,但也可以改写只报错误而不停止,即不调用abort()。
3.6不要浪费别人的时间—详细说明不清楚的断言;消除所做的隐式假定,或者利用断言检查其正确性例如:有时候我们会不自觉的认为一个字节占8位,或者说一个long型占据4个字节,这些都是对编译程序或操作系统做的一些假定。这使得我们需要在程序中使用断言例如ASSERT(sizeof(long)==4&&CHAR_BIT==8)。
3.7断言是进行调试检查的简单方法。要使用断言来检查绝对不应该发生的非法情况,不要混淆非法情况和错误情况,错误情况是需要在最终产品中处理的。
3.71利用断言对函数的参数进行确认,并且当程序员使用了无定义特性时向程序员报警。
3.72当编写函数时,应反复问自己做了哪些假定,一旦确定了相应的假定,就要使用断言对所做的假定进行检验,或者重新编写代码去除假定。
4静态断言与普通断言:
静态断言可以在编译时就对程序的错误做出判断,而普通断言只能在程序运行出现错误的时候做出退出并产生调试信息
static_assert(condition,string_condition);
第一次参数是表达式,第二个参数是输出的信息
static_assert()是C++ 新增的内容
在C语言里可以这样实现:
#define JOIN( X , Y ) JOIN_AGIN( X, Y )
#define JOIN_AGIN(X,Y) X##Y
typedef static_assert(e)\
typedef char JOIN(assert_failed_at_line,__LINE___) [(e)?1:-1]
C语言-断言的更多相关文章
- C语言 断言 总结
转载: http://wenda.so.com/q/1378817559065638?src=140 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止 ...
- C语言断言
1.概述 断言是对某种假设条件进行检查(可理解为若条件成立则无动作,否则应报告),它可以快速发现并定位软件问题,同时对系统错误进行自动报警.断言可以对在系统中隐藏很深,用其它手段极难发现的问题进行定位 ...
- 让我们一起Go(十三)
前言: 上篇,我们了解了Go语言接口的一些知识,在这篇中,我们将继续聊聊接口这东西. Go语言空接口 Go语言中定义一个空接口,也就是没有任何函数需要实现的接口就是一个空接口,作为一个空接口,因为对象 ...
- NSAssert和NSParameterAssert
2016.05.05 18:34* 字数 861 阅读 5127评论 0喜欢 17 https://www.jianshu.com/p/3072e174554f NSAssert和NSParamete ...
- GO语言总结(5)——类型转换和类型断言
上一篇博客介绍了Go语言的数组和切片——GO语言总结(4)——映射(Map),本篇博客介绍Go语言的类型转换和类型断言 由于Go语言不允许隐式类型转换.而类型转换和类型断言的本质,就是把一个类型转换到 ...
- c语言静态断言-定义自己的静态断言
c语言里面可以自己定义静态断言,更加方便的调试代码. 使用静态断言 #include<stdio.h> #include<stdlib.h> #include<asser ...
- c语言静态断言
在php中可以通过xdebug来显示详细的错误信息,可以细化到哪个文件哪行代码引起的报错.在C语言里面也可以通过静态断言(assert)来使得调试代码更加方便.关于断言,可以作为一种很强大的调试方式或 ...
- 编程精粹--编写高质量C语言代码(3):自己设计并使用断言(二)
接着上一遍文章<<编程精粹--编写高质量C语言代码(2):自己设计并使用断言(一)>>,继续学习怎样自己设计并使用断言,来更加easy,更加不费力地自己主动寻找出程序中的错误. ...
- go语言笔记——是c开发的 lex yacc进行词法和语法分析,go不支持函数和运算符重载,不支持类型继承,也不支持断言,还有泛型
从 Go 1.0.3 版本开始,不再使用 8g,8l 之类的指令进行程序的构建,取而代之的是统一的 go build 和 go install 等命令,而这些指令会自动调用相关的编译器或链接器. 如果 ...
随机推荐
- 网关集成Swagger出现404错误
原因是忘了在需要生成api的类上加入注解 @EnableSwagger2Doc
- docker 环境部署
docker 查看所有容器 docker ps -a docker 查看所有running 容器: docker ps docker 停止全部容器: docker stop $(docker ps ...
- shell脚本编程学习笔记(四)shell操作数据库
一.数据库基本操作 1)登录mysql服务器:mysql -u root -p 密码 2)查看数据库:show databases 3)查看表:show tales from db; 4)查看表结构: ...
- 边双连通分量 jarjan (poj 3177)
大意:给定一个无向连通图,判断至少加多少的边,才能使任意两点之间至少有两条的独立的路(没有公共的边,但可以经过同一个中间的顶点). 思路:在同一个双连通分量里的所有的点可以看做一个点,收缩后,新图是一 ...
- vue 循环多个标签,点击标签变色,再点击取消,可以同时点击多个
效果: <div class="relFacilityTitcon"> <i v-for="(item,index) in facilityList&q ...
- ALSA lib基本概念
1.channel 通道,即我们熟知的声道数.左/右声道,5.1channel等等 2.sample A sample is a single value that describes the amp ...
- 在linux里面ps -ef | grep tomcat 什么意思
linux中的查看和tomcat有关系的进程的命令 例如 [root@localhost bin]# ps -eaf | grep tomcat root 5091 1 0 23:04 pts/0 0 ...
- java ArrayList添加元素全部一样
#开始 今天遇到了一个很神奇的事情 也即是我在用ArrayList的add方法循环加入对象的时候 发现添加的元素全部都是一样的 定位错误定位了一个下午.... 错误位置就是哪一个位置 但是就是不知道为 ...
- MySQL主从复制(一主两从)
主库开启bin-log二进制日志功能,并建立slave账号,并授权从库连接主库,从库通过change master得到主库的相关同步信息, 然后连接主库进行验证,主库产生的新数据会导入到bin- ...
- Python - 查看类的方法和属性,dir(),help()
1. dir()查看类的方法和属性 查看slice类的方法和属性 dir(slice) 2.help() 查看某个方法的文档 查看slice类中的indices方法 help(slice.indice ...