当前位置: 首页 > news >正文

c语言-assert(断言)的笔记

一、assert(断言)简介

assert的功能,条件为真,程序继续执行;如果断言为假(false),则程序终止。

assert是个宏定义

头文件:

#include <assert.h>

原型:

void assert(scalar expression);

返回值:无返回值。

头文件assert.h内容如下:

/* Copyright (C) 1991-2018 Free Software Foundation, Inc.This file is part of the GNU C Library.The GNU C Library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 2.1 of the License, or (at your option) any later version.The GNU C Library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with the GNU C Library; if not, see<http://www.gnu.org/licenses/>.  *//**  ISO C99 Standard: 7.2 Diagnostics  <assert.h>*/#ifdef  _ASSERT_H# undef  _ASSERT_H
# undef  assert
# undef __ASSERT_VOID_CAST# ifdef  __USE_GNU
#  undef assert_perror
# endif#endif /* assert.h  */#define  _ASSERT_H  1
#include <features.h>#if defined __cplusplus && __GNUC_PREREQ (2,95)
# define __ASSERT_VOID_CAST static_cast<void>
#else
# define __ASSERT_VOID_CAST (void)
#endif/* void assert (int expression);If NDEBUG is defined, do nothing.If not, and EXPRESSION is zero, print an error message and abort.  */#ifdef  NDEBUG# define assert(expr)    (__ASSERT_VOID_CAST (0))/* void assert_perror (int errnum);If NDEBUG is defined, do nothing.  If not, and ERRNUM is not zero, print anerror message with the error text for ERRNUM and abort.(This is a GNU extension.) */# ifdef  __USE_GNU
#  define assert_perror(errnum)  (__ASSERT_VOID_CAST (0))
# endif#else /* Not NDEBUG.  */#ifndef _ASSERT_H_DECLS
#define _ASSERT_H_DECLS
__BEGIN_DECLS/* This prints an "Assertion failed" message and aborts.  */
extern void __assert_fail (const char *__assertion, const char *__file,unsigned int __line, const char *__function)__THROW __attribute__ ((__noreturn__));/* Likewise, but prints the error text for ERRNUM.  */
extern void __assert_perror_fail (int __errnum, const char *__file,unsigned int __line, const char *__function)__THROW __attribute__ ((__noreturn__));/* The following is not at all used here but needed for standardcompliance.  */
extern void __assert (const char *__assertion, const char *__file, int __line)__THROW __attribute__ ((__noreturn__));__END_DECLS
#endif /* Not _ASSERT_H_DECLS *//* When possible, define assert so that it does not add extraparentheses around EXPR.  Otherwise, those added parentheses wouldsuppress warnings we'd expect to be detected by gcc's -Wparentheses.  */
# if defined __cplusplus
#  define assert(expr)              \(static_cast <bool> (expr)            \? void (0)              \: __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
# elif !defined __GNUC__ || defined __STRICT_ANSI__
#  define assert(expr)              \((expr)                \? __ASSERT_VOID_CAST (0)            \: __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
# else
/* The first occurrence of EXPR is not evaluated due to the sizeof,but will trigger any pedantic warnings masked by the __extension__for the second occurrence.  The ternary operator is required tosupport function pointers and bit fields in this context, and tosuppress the evaluation of variable length arrays.  */
#  define assert(expr)              \((void) sizeof ((expr) ? 1 : 0), __extension__ ({      \if (expr)                \; /* empty */              \else                \__assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION);  \}))
# endif# ifdef  __USE_GNU
#  define assert_perror(errnum)            \(!(errnum)                \? __ASSERT_VOID_CAST (0)            \: __assert_perror_fail ((errnum), __FILE__, __LINE__, __ASSERT_FUNCTION))
# endif/* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__'which contains the name of the function currently being defined.This is broken in G++ before version 2.6.C9x has a similar variable called __func__, but prefer the GCC one sinceit demangles C++ function names.  */
# if defined __cplusplus ? __GNUC_PREREQ (2, 6) : __GNUC_PREREQ (2, 4)
#   define __ASSERT_FUNCTION  __extension__ __PRETTY_FUNCTION__
# else
#  if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
#   define __ASSERT_FUNCTION  __func__
#  else
#   define __ASSERT_FUNCTION  ((const char *) 0)
#  endif
# endif#endif /* NDEBUG.  */#if defined __USE_ISOC11 && !defined __cplusplus
# undef static_assert
# define static_assert _Static_assert
#endif

assert的定义如下:

6b8cc476e0ab37b9a671decd7d0d7968.png

此句意思如下:

expr为真,
执行 __ASSERT_VOID_CAST (0)  ;
否则执行 __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))

条件表达式,伪代码:

a?b:c
//如果a为真,执行b;
//如果a为假,执行c

二、测试代码

参数数量为2,则输出参数。否则输出错误信息,并终止程序执行。测试代码如下:

#include <stdio.h>
#include <assert.h>int main(int argv,char *argc[])
{printf("argv=%d\n",argv);assert(argv== 2);printf("argc[1]=%s\n",argc[1]);return 0;
}

b78710bc6b9840574d8bbff951738ad9.png

290656c928ccd4b7c43b3820b8977c44.png

欢迎关注公众号:嵌入式学习与实践

相关文章:

  • openssl+sha256开发实例(C++)
  • 【Shell脚本10】Shell 流程控制
  • java算法学习索引之动态规划
  • IntelliJ IDEA 安装 GitHub Copilot插件 (最新)
  • HTTP服务器——tomcat的安装和使用
  • 前端案例-css实现ul中对li进行换行
  • 若依侧边栏添加计数标记效果
  • Flink之Java Table API的使用
  • GPU编程
  • 【机器学习】 朴素贝叶斯算法:原理、实例应用(文档分类预测)
  • 使用validator实现枚举类型校验
  • MacOS Ventura 13 优化配置(ARM架构新手向导)
  • VSCode 好用的插件分享
  • 【多线程 - 04、Join 方法与 wait 方法】
  • postman调用接口报{“detail“:“Method \“DELETE\“ not allowed.“}错误, 解决记录
  • ----------
  • 【Leetcode】101. 对称二叉树
  • 【剑指offer】让抽象问题具体化
  • JS专题之继承
  • vue-loader 源码解析系列之 selector
  • vue数据传递--我有特殊的实现技巧
  • 经典排序算法及其 Java 实现
  • 理清楚Vue的结构
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 驱动程序原理
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 在Unity中实现一个简单的消息管理器
  • 栈实现走出迷宫(C++)
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 从如何停掉 Promise 链说起
  • 关于Android全面屏虚拟导航栏的适配总结
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​Python 3 新特性:类型注解
  • ​马来语翻译中文去哪比较好?
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (转)ABI是什么
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • ./configure,make,make install的作用
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net中我喜欢的两种验证码
  • .so文件(linux系统)
  • @EventListener注解使用说明
  • @ModelAttribute使用详解
  • @RestController注解的使用
  • @selector(..)警告提示