C++ 断言

article/2025/9/22 6:56:54

文章目录

  • 前言
  • assert
  • static_assert

前言

断言(Assertion)是一种常用的编程手段,用于排除程序中不应该出现的逻辑错误。它是一种很好的Debug工具。其作用是判断表达式是否为真。C++提供了assertstatic_assert来进行断言。在C库中也有断言,其中断言与C++的相同,静态断言是_Static_assert

assert

assert是一个仿函数宏,用于程序在运行时进行断言。它在标头<assert.h>中定义:

#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition)
#endif

若编译为release版本,编译器一般会定义NDEBUG,则assert失效。若是在debug下,assert 中的表达式若为假,则 assert 在标准错误输出上输出实现指定的诊断信息,并调用 std::abort 。

因为 assert 是仿函数宏,在 condition 中未被括号保护的逗号都被转译成宏参数的分隔符。而assert只接受一个参数,所以需要注意:

assert(std::is_same_v<int, int>);           // 错误: assert 不接收二个参数
assert((std::is_same_v<int, int>));         // 正确:一个参数
static_assert(std::is_same_v<int, int>);    // 正确:非宏
std::complex<double> c;
assert(c == std::complex<double>{0, 0});    // 错误
assert((c == std::complex<double>{0, 0}));  // 正确 

下面我们以一个字符串换成类作为示例代码,在设置内容和打印内容的时候进行断言,保证m_str分配了内存:

#include <assert.h>
#include <string.h>
#include <iostream>
using namespace std;class StrBuf{
private:char* m_str = nullptr;
public:void alloc_memory(int size){if(m_str == nullptr)m_str = new char[size];}void setbuf(const char* str){assert(m_str != nullptr);strcpy(m_str,str);}void print(){assert(m_str != nullptr);for(int i=0;m_str[i]!='\0';i++)cout<<m_str[i];}
};int main(){StrBuf sbuf;sbuf.alloc_memory(10);sbuf.setbuf("hello");sbuf.print();
}

输出正常,输出文本内容:

hello

如果我们将alloc_memory函数(分配内存)注释掉:

int main(){StrBuf sbuf;//sbuf.alloc_memory(10);sbuf.setbuf("hello");sbuf.print();
}

输出的内容如下,运行时输出了断言结果,并结束了程序:

Assertion failed: m_str != nullptr, file D:\SingleSources\CPP\8.cpp, line 15

static_assert

C++11新增了静态断言static_assert,它是内置的,因此使用静态断言不需要包含头文件。与assert在运行时检查不同,static_assert在编译阶段时检查源代码。

static_assert ( boolean expression, message )  //since C++11
static_assert ( boolean expression )		   //since C++17

示例,静态断言一个为FALSE的表达式:

constexpr bool getFalseExpr(){return false;
}int main(){static_assert(getFalseExpr(),"false expression");
}

编译时报错,并输出了信息"false expression":

8.cpp: In function 'int main()':
8.cpp:6:31: error: static assertion failed: false expression6 |     static_assert(getFalseExpr(),"false expression");|                   ~~~~~~~~~~~~^~


http://chatgpt.dhexx.cn/article/MDqosg5V.shtml

相关文章

SVA断言

目录 Assertion介绍什么是assertion&#xff1f;断言覆盖率断言语言的发展与进步类型划分立即断言并行断言并行断言的执行阶段assertion&#xff0c;property&#xff0c;sequencesequences sequence定义基本操作符号and操作符号intersect操作符号or操作符号first_match操作符号…

常见结构化存储系统架构

什么是结构化存储系统 结构化数据一般指存储在数据库中&#xff0c;具有一定逻辑结构和物理结构的数据&#xff0c;最为常见的是存储在关系数据库中的数据&#xff1b;非结构化数据&#xff1a;一般指结构化数据以外的数据&#xff0c;这些数据不存储在数据库中&#xff0c;而…

DRAM存储系统结构

这几天在学习DRAM存储结构的基本知识&#xff0c;为了更好地理解DRAM结构的基本知识&#xff0c;仔细阅读了Memory Systems Cache, DRAM, Disk这本书中第十章节的内容&#xff0c;并翻译了所述内容。为了方便以后查阅&#xff0c;把所做笔记记录一下。 DRAM存储系统结构 前几章…

第3章 Linux存储系统

三大基本存储架构(DAS,SAN,NAS) 直接附加的存储DAS:Linux 支持种类繁多的 DAS 界面&#xff0c;包括像并行高级技术附件的旧标准 — 电子集成驱动器 IDE/ATA — 并行 SCSI 和光纤通道以及新的存储界面&#xff0c;例如串行连接的 SCSI、串行 ATA 和外部 SATA 。您还将发现高级…

单机存储系统

单机存储引擎就是哈希表、B树等数据结构在机械磁盘和SSD等持久化介质上的实现。 单机存储系统是单机存储引擎的一种封装&#xff0c;对外提供文件、键值、表格或者关系模型&#xff0c;单机存储系统的理论来源于关系数据库。 哈希存储引擎是哈希表的持久化实现。 B树存储引…

存储系统和结构

很久没有在CSDN上面发文章了&#xff0c;最近复习机组的存储器&#xff0c;感慨自己这两年把知识都还给老师了&#xff0c;便做个笔记好好整理一下&#xff0c;也有了一些新收获。转载请注明来源&#xff1a;https://leerw.github.io 存储系统和结构 存储系统 将两个或来两…

存储系统 —— Cache(高速缓冲存储器)

本文主要介绍以下几方面的知识&#xff1a; Cache 的基本工作原理Cach和主存之间的映射方式Cache中主存块的替换算法Cache写策略 1.Cache的基本工作原理 存储系统存在的问题 局部性原理 (3)Cache 工作原理 性能分析 块地址形式 2.Cach和主存之间的映射方式 (1)全相联…

3-1存储系统-存储器概述主存储器

文章目录 一.存储器概述&#xff08;一&#xff09;存储器分类1.按在计算机中的作用&#xff08;层次&#xff09;分类2.按存储介质分类3.按存取方式分类4.按信息的可保存性分类 &#xff08;二&#xff09;存储器的性能指标 二.主存储器&#xff08;一&#xff09;基本组成1.译…

存储系统的层次结构

目录 一.背景二.层次结构&#xff08;1&#xff09;结构&#xff08;2&#xff09;原理&#xff08;3&#xff09;性能 一.背景 现在我们使用的计算机系统结构是冯诺依曼体系结构&#xff0c;它的一个特点就是中央处理器CPU&#xff08;控制器算数运算器&#xff09;与存储器相…

分布式存储Ceph存储系统RADOS

RADOS是Ceph最为关键的技术&#xff0c;它是一个完整的对象存储系统&#xff0c;所有存储在Ceph系统中的数据最终由这一层来存储。本文主要介绍RADOS的系统架构和IO处理流程&#xff0c;以了解Ceph存储的设计原理。 1、Ceph功能模块与RADOS Ceph存储系统的逻辑结构在“分布式系…

计算机存储系统

前言 何为存储系统&#xff1f; 存储系统是指计算机中由存放程序和数据的各种存储设备、控制部件及管理信息调度的设备&#xff08;硬件&#xff09;和算法&#xff08;软件&#xff09;所组成的系统。 为何需要存储系统&#xff1f; 信息是人类认知外界的方式&#xff0c;最初…

存储系统的概念

1.程序的局部性原理 统计表明, 无论是访问存取指令还是存储数据&#xff0c;在一个较短的时间间隔内&#xff0c;程序所访司的存储器地址在很大比例上集中在存储器地址空间的很小范围内。 这种在某一段时间内预繁访问某一局部的存储器地址空间、而对此范围以外的地址空间则很少…

存储系统-概念

概念 存储系统是计算机的重要组成部分之一。存储系统提供写入和读出计算机工作需要的信息&#xff08;程序和数据&#xff09;的能力&#xff0c;实现计算机的信息记忆功能。现代计算机系统中常采用寄存器、高速缓存、主存[内存]、外存[可以理解为磁盘,磁带等]的多级…

计算机组成原理——存储系统(超详细,必看!!)

本篇文章是对王道考研的2021计算机组成原理学习笔记&#xff0c;希望对大家有所帮助。 文章目录 三、存储系统3.1 基本概念1.存储器的层次结构2.存储器的分类3.存储器的性能指标 3.2主存储器3.2.1主存储器的基本组成3.2.2 随机存取存储器RAM1.存储元件不同导致的特性差异2.DRAM…

修改并保存hosts文件

文章目录 问题解决方法 问题 打开hosts文件发现无法修改或者修改后点击保存后是另存为 解决方法 首先找到hosts文件&#xff0c;文件在 C:\Windows\System32\drivers\etc 目录下 选择hosts文件右键选择属性 把属性中只读前面的对号去掉然后点击确定 然后就可以修改保存了

Win11修改hosts文件方法,Win11无法修改hosts解决方法

博主亲测有效&#xff01; 1.找到hosts文件的位置。 首先找到hosts文件&#xff0c;W11的host文件目录是c:\windows\system32\drivers\etc 2.修改hosts文件权限 选中hosts文件&#xff0c;右键选择属性&#xff0c;弹出属性窗口。 默认权限是只读状态&#xff0c;取消勾选。…

Windows下修改hosts文件

Windows下修改本地域名解析文件&#xff0c;原因你懂的&#xff0c;当然多数人选择修改这个应该都是选择最优或者较优的IP地址服务器进行访问。很多网站在运营商DNS服务器上的IP地址非常慢。 我们可以不做任何文件权限的修改&#xff0c;也不用蠢到删除用户之后只保留Admin用户…

win10如何修改hosts文件?

win10修改hosts文件的方法&#xff1a; 1、打开c盘&#xff0c;点击“Windows”&#xff0c;点击“system32”-“drivers”-“etc”&#xff0c;找到hosts文件&#xff1b; 2、修改hosts文件的权限 右键hosts文件&#xff0c;选择属性。 选择“安全”选项&#xff0c;点击ho…

win10 修改hosts文件

在win10之前修改hosts文件非常简单&#xff0c;直接使用notepad就可以修改了&#xff0c;到了win10阶段&#xff0c;就没那么简单了&#xff0c;你能看到hosts文件&#xff0c;就是改不了。 C:\Windows\System32\drivers\etc目录下&#xff1a; 就是改不了。 下面聊一下修改的…

Windows系统如何修改Hosts文件

Hosts其实是IP和网址建立的一个关联关系&#xff0c;在hosts配置好IP和网址&#xff0c;用户访问此网址时&#xff0c;会自动在hosts配置文件中找对应关系&#xff0c;找到后就会打开网页。 1.在配置hosts时&#xff0c;需要给当前用户分配权限。在hosts文件上右键菜单点击属性…