C/C++ 断言(assert)的用法


assert() / 断言


1. assert()原型

#include "assert.h" 
void assert( int expression );

assert() 是个宏。

assert() 是一个调试程序时经常使用的宏。

写代码的时候熟练的使用assert,可以给自己的代码调试带来极大的便利。

其作用是先计算表达式 expression ;

  1. 如果expression的值为false(0),那么它先向stderr打印一条出错信息,然后通过调用abort 来终止程序运行。
  2. 如果expression的值为true,则继续执行后面的语句。

这个宏通常用来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。


2. assert()的开启和关闭

程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。

使用assert()的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销;所以assert()只有在 Debug 版本中才有效,如果编译为 Release 版本则应该被忽略。

那么 assert()宏 如何屏蔽或启用?

在调试结束后,可以通过在包含 #include 的语句之前插入 #define NDEBUG 来禁用 assert 调用,示例代码如下:

#include 
#define NDEBUG 
#include

3. 一般在什么情况下使用assert()?

类型检查
单元测试
确定各种特性是否在程序中得到维护

1.可以在预计正常情况下程序不会到达的地方放置断言。(如assert (0);)
2.使用断言测试方法执行的前置条件和后置条件 。
3.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如某个变量的变化范围)

前置条件断言:代码执行之前必须具备的特性
后置条件断言:代码执行之后必须具备的特性
前后不变断言:代码执行前后不能变化的特性


4. 使用assert()应该养成的良好习惯

当然在使用的断言的过程中会有一些我们应该注意的事项和养成一些良好的习惯,如:
1.每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败
2.不能使用改变环境的语句,因为assert只需要在DEBUG阶段生效,如果这么做,会使用程序在真正运行时遇到问题
3.assert和后面的语句之间应空一行,让代码风格更清晰明朗
4.有的地方,assert不能代替条件过滤
5.在函数开始处检验传入参数的合法性
6.断言语句不可以有任何边界效应


  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值