C++ assert 断言

断言,指在个人的语言中,轻易地在短时间内对某一件事情或者事物下的一种主观性非常强的言论。如果事实与断言不符,则会被啪啪打脸。C++里面的assert也是起这样一个作用。

include <assert.h>

void assert (int expression);

虽然在cplusplus上面assert是这样子的,但是其实它是一个宏。
当assert的表达式(即参数expression)等于0或者为false时,assert会向stderr输出一些错误信息,并且调用abort终止程序运行。
assert输出的错误信息不同的库可能不一样,但是一般都会包含错误的表达式、源文件的名字、assert所在的行数。
同时,C++提供了另外一个宏 NDEBUG 用来使assert失效,需要添加在#include <assert.h>之前。所以可以在debug的时候可以添加一些assert帮助调试,而发布release版本的时候定义 NDEBUG 使assert失效。

主要用法和注意事项:
1)用于检验变量的值是否在合法范围之内。大量使用if...else...会使代码变得非常拖沓,而且assert自带错误信息输出,非常方便定位。但缺点是assert失败时整个程序会退出,所以除非一些无法处理且会造成崩溃的非法值,否则应当尽量避免使用assert。
2)用于协助debug。能够判断变量的值是否在预期之内,可以大量减少日志输出,缺点是如果表达式不够严谨,可能会将一些错误的值当成正确的值而没有输出错误信息。
3)assert每次应当只检验一个条件。当校验多个条件而又失败时,因为assert并不输出表达式各变量的值,所以无法判断是哪个条件失败了。
4)当使用编译器编译时,应该注意release和debug版本的区别,一般而言,很多编译器在编译release版本都会定于NDEBUG ,使得assert失效。在这种情况下,应当不要依赖assert去校验变量,也不要在assert中修改变量的值。
5)据说assert比if会有很大的消耗,等我找个时间去检验一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,688评论 19 139
  • iOS面试小贴士 ———————————————回答好下面的足够了------------------------...
    不言不爱阅读 2,254评论 0 7
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 1,846评论 0 4
  • 史上最全的iOS面试题及答案 迷途的羔羊--专为路痴量身打造的品牌。史上最精准的定位。想迷路都难!闪电更新中......
    南虞阅读 1,643评论 0 8
  • 你是否还记得那年你所说过的话和许下的承诺,不是对谁说的,而是对自己说的! 四年,能改变的事太多太多!四年前的你在哪...
    凉茶妹纸阅读 259评论 0 0

友情链接更多精彩内容