断言—assert()

断言assert()主要用于调试,仅在debug模式下有效,用于捕获预期不应出现的非法情况。当断言失败时,表示程序存在bug并终止执行。在release模式下,assert不会执行任何操作。assert应区分非法情况和错误情况,适用于检测程序员认为不应该出现的状况,如空指针。在malloc后检查指针是否为NULL,若为非法情况则适合使用assert,若为合法但需处理的情况则应使用if。错误的assert用法可能导致对合法但需处理的情况(如malloc失败)未做处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

断言—assert()

1. 概述

  • assert是调试宏而不是一个函数,只在debug才有效
  • 判断条件结果为假(NULL)抛出异常,或者说条件不成立时抛出异常。
  • 使用 assert 来捕捉程序运行过程中出现的非法情况,在你的程序中,如果你认为某种情况肯定不会出现,一旦出现,就说明你的程序在某块存在错误,比如除法时除数不为0,此时最好用 assert 断言;而该情况可能会出现且是合法情况,此时最好用if来判断,比如 malloc 空间时返回 NULL 。

2. 定义

  • assert 宏的原型定义在 <assert.h> 中,其作用是如果它的条件返回错误,则终止程序执行
  • 在刚开始学习代码的时候,对于程序中检查程序有效性时有时用到assert,有时用if,感到非常困惑。比如,在多数的 malloc 函数后面对指针进行的操作都是用 assert 进行检查的,可能会造成一种错觉以为在 malloc 之后对申请空间的检测是用 assert 进行的,但可能也会看到用 if 对 malloc 进行判断并处理,到底是 if 还是 assert 呢?
  • 以下是库中关于assert的定义,我将其他一些地方去掉了:
#ifdef  NDEBUG
#define assert(_Expression)     ((void)0)
#else
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
#endif

NDEBUG 为非调试模式,即 release 模式。可以看到,在 release 模式下 assert 宏什么事情都没有干,但是在 debug 模式下,如果表达式的值为 0,则输出消息并终止程序的执行。表达式为真时不会进行任何操作。所以断言失败,就表明程序存在 bug,出现了预期不应该出现的情况。也就是说在 release 模式下,assert 宏相当于不存在了(在 vs2012 上测试确实如此)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值