assert断言

embedded/2024/9/26 1:24:03/

1.assert断言介绍

1.使用方法

assert.h 头头件定义了宏 assert() ,用于在运行时确保程序符合指定条件,如果不符合,就
错终止运行
。这个宏常常被称为“断言”

int main()
{int*p=NULL;if(p!=NULL){*p=100;}return 0;
}

例如在以上代码中就可以用assert断言来替代if语句 

#include<assert.h>
int main()
{int*p=NULL;assert(p!=NULL)*p=100;return 0;
}

assert() 宏接受⼀个表达式作为参数。如果该表达式为(返回值非零), assert() 不会产生
任何作用
,程序继续运行。如果该表达式为(返回值为), assert() 就会报错,在标准错误流(屏幕上) stderr 中写入⼀条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号

真如以上所示,当assert后表达式为时候就会终止运行,并且给出报错信息提示,由此可见该程序错误行号为6

 2.无需更改代码开启或关闭 assert() 的机制

assert()对我们编写程序十十分友好的,不仅可以像以上一样把程序运行时出错的错误信息打印在屏幕上,其实还无需更改代码就可以开启或关闭assert()。

要实现这种效果这时就需要在已经确认程序没有bug时,无需assert()机制时在#include <assert.h> 语句的前面,定义一个宏 NDEBUG 

#define NDEBUG
#include<assert.h>
int main()
{int* p = NULL;assert(p != NULL);* p = 100;return 0;
}

正如以上程序,原本assert后表达式内容为假,运行程序本应该报错,但定义一个宏 NDEBUG 之后就不会显示出报错信息提示 其实定义一个宏 NDEBUG之后 编译器就会禁用文件中所有的 assert() 语句。

如果程序又出现问题,可以移除这条 #define NDEBUG 指令(或者把它注释掉),再次编译,这样就重新启用了 assert() 语句。

在使用assrt时,程序因为引入了额外的检查,增加了程序的运行时间,所以一般我们只在调试版本中使用,而在发布版本版本中会将assert()机制关闭

而在vs中VS 这样的集成开发环境中,在 Release 版本中,直接就是优化掉了assert

2.assert使用举例

strlen的模拟实现

库函数strlen的功能是求字符串长度,统计的是字符串中 \0 之前的字符的个数
了解之后我们就可以来模拟strlen的实现

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
size_t my_strlen(char const* p)
{int count = 0;assert(p != NULL);while (*p != '\0'){count++;p++;}return count;
}
int main()
{char arr[] = "abcdef";int sz = sizeof(arr) / sizeof(arr[0]);printf("%zd", my_strlen(arr));return 0;
}

运行程序结果如下 

 

在该代码中使用到了const在*左边可以防止数组arr内容被修改 ,提升了代码的鲁棒性,同时使用assert断言可以使指针p为空时报错


http://www.ppmy.cn/embedded/40268.html

相关文章

C++(长度最小子数组)

题目&#xff08;力扣链接&#xff1a;209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09;&#xff09; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [numsl, numsl1, ..., numsr-1,…

【Element-UI快速入门】

文章目录 **Element-UI快速入门****一、Element-UI简介****二、安装Element-UI****三、引入Element-UI****四、使用Element-UI组件****五、自定义Element-UI组件样式****六、Element-UI布局组件****七、Element-UI表单组件****八、插槽&#xff08;Slots&#xff09;和主题定制…

Ansible---inventory 主机清单

一、inventory 主机清单 1.1、inventory介绍 hosts配置文件位置&#xff1a;/etc/ansible/hosts Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 1.2、inventory中的变量 Inventory变量名含义…

『先进技术助力』Kompas AI:智能AI代理在工作中的应用与效率提升

『智能化未来』Kompas AI如何改变我们的工作方式&#xff1f; 在这个信息时代&#xff0c;利用AI聊天机器人来处理机械性的工作已经成为一种趋势。ChatGPT作为一种智能助手&#xff0c;不仅能够提高工作效率&#xff0c;还可以帮助我们更明智地做出决策&#xff0c;从而释放出更…

Shell编程之循环语句之for

一.for循环语句 读取不同的变量值&#xff0c;用来逐个执行同一组命令 for 变量名 in 取值列表 do命令序列 done 示例&#xff1a; 1.计算从1到100所有整数的和 2.提示用户输入一个小于100的整数&#xff0c;并计算从1到该数之间所有整数的和 3.求从1到100所有整数的偶数和…

【intro】Graph Isomorphism Network(GIN)

论文 https://arxiv.org/pdf/1810.00826 abstract 图神经网络(gnn)是一种有效的图表示学习框架。gnn采用邻域聚合方案&#xff0c;通过递归聚合和变换相邻节点的表示向量来计算节点的表示向量。已经提出了许多GNN变体&#xff0c;并在节点和图分类任务上取得了最先进的结果。…

一本专业130+总分400+上海交通大学819考研经验上交电子信息与通信工程上岸,真题,大纲,参考书。

今年专业课819信号系统与信号处理130&#xff0c;总分400&#xff0c;复试表现中规中矩&#xff08;初试分数查到才开始复习复试&#xff0c;希望大家汲取教训&#xff0c;初试考完就可以录取开始准备复试&#xff09;&#xff0c;交大初试比重很高&#xff0c;良心学校&#x…

C++笔记(体系结构与内核分析)

1.OOP面向对象编程 vs. GP泛型编程 OOP将data和method放在一起&#xff0c;目的是通过封装、继承、多态提高软件的可维护性和可扩展性GP将data和method分开&#xff0c;可以将任何容器与任何算法结合使用&#xff0c;只要容器满足塞饭所需的迭代器类型 2.算法与仿函数的区别 …