断言是很早之前就有的东西了,只需要引入cassert头文件即可使用。往往assert被用于检查不可能发生的行为,来确保开发者在调试阶段尽早发现“不可能”事件真的发生了,如果真的发生了,那么就表示代码的逻辑存在问题。最好的一点就是,断言只在Debug中生效,因此对于Release版本是没有效率上的影响的。  

#include <iostream>
#include <cassert>
using namespace std;int main() {int i = 22;assert(i != 22);system("pause");return 0;
}

  上面的代码就表示,你确认在这里i一定不会等于22,如果事实上真的是22,那么程序就会无情地被abort,并报告出现问题的源文件和行号(使用了魔法常量__FILE__和__LINE__),有助于及时定位问题。

  断言有一个问题,就是一定会abort,强制整个程序退出而导致调试也无法继续进行,就像上图这样,出现问题后,我们知道了出现问题的行号,但是我们需要手动在该行的上面设置断点,重新开始调试才能够检查到发生问题时各个变量的状态。而且,有时问题不是那么容易重现,于是就可能出现没法重现错误再检查状态的问题。

  所以,我们可以自己写一个类似的宏来解决这个问题,我们希望在违反断言时触发断点陷阱门中断而不是调用abort,这样,在违反断言时程序会暂停下来,等待程序员来检查当前的状态有何异常。

  下面是一个Visual C++中的实现。

#include <iostream>
#include <cassert>
using namespace std;#define _ASSERT(x) if (!(x)) __asm {int 3};int main() {int i = 22;//assert(i != 22);_ASSERT(i != 22);system("pause");return 0;
}

  上面定义了一个宏,名字当然可以自己取,实际上做的一件事就是检查断言,然后如果断言结果为false(0),那么就调用内联汇编指令int 3陷入调试中断。

  在2011年的C++标准中出现了静态断言(static_assert)的语法,所谓静态断言,就是在编译时就能够进行检查的断言,static_assert是C++的标准语法,不需要引用头文件。静态断言的另一个好处是,可以自定义违反断言时的编译错误信息。

#include <iostream>
using namespace std;int main() {const int i = 22;static_assert(i != 22, "i equals to 22");system("pause");return 0;
}

  这个代码,将无法通过编译,因为i的值违反了静态断言。

  静态断言的限制是,断言本身必须是常量表达式,如果这样的i不是常量,静态断言是不符合语法的。

转载于:https://www.cnblogs.com/MrYuan/p/4800087.html

C++断言与静态断言相关推荐

  1. C++笔记-断言、静态断言、R转义符

    目录 断言 静态断言 R转义符 断言 在assert.h和cassert中有这3个短语,可以获取当前文件,第几行.哪个函数. 感觉这个在Linux调试上十分有用,在此记录下! 程序运行截图如下: 源码 ...

  2. c语言 静态断言,C断言/静态断言

    关于断言,可以作为一种很强大的调试方式或者程序运行时的错误诊断 但是断言也不是适合于各种地方,服务器软件和嵌入式程序一般不适用,断言会强制中断正在运行的程序,对于服务器等程序来说, 将会是一个灾难.加 ...

  3. C++11的静态断言

    断言就是将一个返回值总是需要为真的判别式放在语句中,来排除在设计的逻辑上不应该出现的情况.C++11标准中引入了静态断言:static_assert 在C++标准中,<cassert>或a ...

  4. c++11中静态断言static_assert

    c++11中的静态断言(static_assert) 在c++11中引入了,目的是在编译时就能检查处一些问题.写法如下: static_assert(常量表达式,提示字符串); 如果第一个参数常量表达 ...

  5. 探索C++0x: 1. 静态断言(static_assert)

    转载请注明来源:http://blog.csdn.net/thesys/archive/2010/06/02/5641350.aspx 简介 C++0x中引入了static_assert这个关键字,用 ...

  6. 21天Jmeter打卡Day20 响应断言,JSON断言

    21天Jmeter打卡Day20 响应断言,JSON断言 https://www.jianshu.com/p/0ab3e5e22673 响应断言 响应断言的适用于返回的是HTML文本,或者是XML文本 ...

  7. java字符串型断言消息_Java断言

    断言概述 编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设 可以将断言看作是异常处理的一种高级形式 断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真 可以在任 ...

  8. web自动化断言_无需断言即可进行Web开发的自动化测试

    web自动化断言 图形用户界面(GUI)测试自动化已损坏. 回归测试不是测试: 它是软件行为的版本控制. 这是我的断言: 没有 断言的测试自动化效果更好! 在软件开发和测试自动化中,断言是一种检查计算 ...

  9. JMeter基础系列(八) JMeter断言之JSON断言

    若服务器返回的Response Body为JSON格式的数据,使用JSON断言来判断测试结果是较好的选择. 首先需要根据JSON Path从返回的JSON数据中提取需要判断的实际结果,再设置预期结果, ...

最新文章

  1. 生物什么时候学公式计算机,高考生物重要规律性关系及公式精华归纳,转走吧!...
  2. Spring JDBC-事务方法嵌套调用解读
  3. 计划策略的配置参数(2)
  4. java jsp filename filepath 图片上传_SpringMVC实现文件上传与下载
  5. The disk contains an unclean file system\
  6. 手把手教你入门Git --- Git使用指南(Linux)
  7. python裁剪图片并保存_python – 如何从图像中剪切轮廓并将其保存到新文件中
  8. 用Python的smtp模块发邮件的示例
  9. Bootstrap3 源代码样式
  10. 转 - 猴子都能看懂的比特币区块链技术之加密算法
  11. 是清单 Dog List的子类 Animal ? 为什么Java泛型不是隐式多态的?
  12. js学习总结----深入扩展-js同步与异步编程
  13. 如何在分屏浏览中并排使用两个Mac软件界面
  14. hermite插值c语言程序,张艳-埃尔米特Hermite 插值逼近的C语言程序.doc
  15. 计算机联锁设备的组成及原理,铁路信号计算机联锁系统及技术分析
  16. ActivityManager.getRunningTasks笔记
  17. php实现微信小程序消息通知
  18. 1+X 5G移动网络运维 - 第一篇
  19. 苹果手机电池怎么保养_苹果手机信号差是网络问题还是手机问题
  20. [第一章 web入门]粗心的小李

热门文章

  1. 再见,前端!别更新了,我是学不动了
  2. 【Java 多线程】多线程带来的的风险-线程安全、多线程五个经典案例
  3. 计算机二级新考纲什么时候出来,有计算机二级考试(VFP)的新考纲吗?
  4. linux ibus中文,Ubuntu 14.10系统中IBUS 中文输入法安装的图文教程
  5. linux shell 批量清空,shell脚本批量删除docker镜像
  6. lastinsertid mysql_mysql错误,帮忙看看
  7. android db加载后无法读取任何内容_android性能优化(二)之卡顿优化
  8. STM8学习笔记---按键KEY
  9. 红黑树插入和删除的各种情况分析
  10. 面向未来 “亿”触即发-中科曙光技术创新大会重磅发布多项创新举措与成果...