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 等命令,而这些指令会自动调用相关的编译器或链接器. 如果 ...
随机推荐
- HTML学习(4)属性
属性是HTML元素提供的附加信息,大多数标签都能设置属性,一般位于开始标签,以名称/值的方式出现,例:name="value". 值要放在引号内(单引号.双引号都可以),如果值包含 ...
- 2019 ICPC南京站网络赛 H题 Holy Grail(BF算法最短路)
计蒜客题目链接:https://nanti.jisuanke.com/t/41305 给定的起点是S,终点是T,反向跑一下就可以了,注意判负环以及每次查询需要添加边 AC代码: #include< ...
- 旋转坐标+前缀和(zqu 25001)
本题题意:在一个矩阵中,去随机一点,设定一个步数K,求出从这个点可以走到的范围的和,求最大值 思路:这个范围的和是一个菱形,我们把他旋转45°,然后成为一个正放的矩阵,求出二维前缀和 然后用前缀和的性 ...
- [2020BUAA软工助教]第1次个人作业
热身作业(阅读) 一.前言 我认为人生就是一次次地从<存在>到<光明>. 二.软件工程师的成长 博客索引 同学们在上这门课的时候基本都是大三,觉得在大学里,到教室来听课有意思么 ...
- RLE压缩算法详解
from:http://data.biancheng.net/view/152.html RLE压缩算法(下简称RLE算法)的基本思路是把数据按照线性序列分成两种情况:一种是连续的重复数据块,另一种是 ...
- C语言实例-大小写字母间的转换
初学C语言都会遇到要求写大小写转换的题目 这类题目主要通过ASCII(美国信息交换标准代码)码差值实现,A对应ASCII码十进制数字是65,a对应ASCII码十进制数字是97,即大小写字母之间ASCI ...
- UVA 10795 A Different Task(模拟)
题目链接:https://vjudge.net/problem/UVA-10795 一道比较有思维含量的一道题: 注意一种分治的思想和“除了柱子x和柱子y之外的那个柱子”编号的问题. 首先在初始局面和 ...
- 精简版logging
# coding=utf-8 import logging import time import os import logging.handlers import re def logger(sch ...
- Dockerfile文档编写
图片显示问题,附上有道云笔记中链接:http://note.youdao.com/noteshare?id=fba6d2f53fd6447ba32c3b7accfeb89b&sub=B36B5 ...
- 图片上传至/target/upload目录下后,通过ip:port/upload/无法访问
做以下配置即可 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { try { registry ...