assert 之后 不执行_「C语言笔记」assert怎么用?

本文介绍了C语言中的assert()宏,用于在代码中捕捉编程假设,帮助定位bug。assert()在assert.h头文件中,当表达式为假时,它会打印错误信息并终止程序。文章通过实例展示了assert在除法运算和STM32库函数中的应用,并对比了assert与if的区别。此外,还提到了C11标准中的_Static_assert,它在编译时进行检查,提高效率。
摘要由CSDN通过智能技术生成

一、什么是assert()?

编写代码时,我们总是会做出一些假设,断言(assert)就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。

断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。

注意assert()是一个宏,而不是函数。

二、assert怎么用?

1、assert所在的头文件及原型

在MinGW工具中,assert()宏在存在于头文件assert.h中,其关键内容如下:

#ifdef NDEBUG#define assert(x)((void)0)#else /* debugging enabled */_CRTIMP void __cdecl __MINGW_NOTHROW _assert (const char*, const char*, int) __MINGW_ATTRIB_NORETURN;#define assert(e)       ((e) ? (void)0 : _assert(#e, __FILE__, __LINE__))#endif/* NDEBUG */

assert()宏接受一个整形表达式参数。如果表达式的值为假,assert()宏就会调用_assert函数在标准错误流中打印一条错误信息,并调用abort()(abort()函数的原型在stdlib.h头文件中)函数终止程序。

当我们认为已经排除了程序的bug时,就可以把宏定义#define NDEBUG写在包含assert.h位置前面。

小知识:

  • __cdecl是C Declaration的缩写(declaration,声明),表示C语言默认的函数调用方法:所有参数从右到左依次入栈。
  • _CRTIMP是C run time implement的简写,C运行库的实现的意思。作为用户代码,不应该使用这个东西。提示是使用dll的动态 C 运行时库还是静态连接的 C 运行库的一个宏。
#ifndef _CRTIMP#ifdef _DLL#define _CRTIMP 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值