C++ 断言
文章目录
- 前言
- assert
- static_assert
前言
断言(Assertion)是一种常用的编程手段,用于排除程序中不应该出现的逻辑错误。它是一种很好的Debug工具。其作用是判断表达式是否为真。C++提供了assert和static_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");| ~~~~~~~~~~~~^~

相关文章:
C++ 断言
文章目录前言assertstatic_assert前言 断言(Assertion)是一种常用的编程手段,用于排除程序中不应该出现的逻辑错误。它是一种很好的Debug工具。其作用是判断表达式是否为真。C提供了assert和static_assert来进行断言。在C库中也有断言,其中断言与C的相同…...
C++修炼之练气期第五层——引用
目录 1.引用的概念 2.引用的性质 3.常量引用 4.使用场景 1.作参数 2.作返回值 5.传值与传引用的效率比较 6.值和引用作为返回值的性能比较 7.引用与指针 指针与引用的不同点 要说C语言中哪个知识点最难学难懂,大部分人可能和我一样的答案——指针。C既然…...
从企业数字化发展的四个阶段,看数字化创新战略
《Edge: Value-Driven Digital Transformation》一书根据信息技术与企业业务发展的关系把企业的数字化分为了四个阶段: 技术与业务无关技术作为服务提供者开始合作科技引领差异化优势以技术为业务核心 下图展示了这四个阶段的特点: 通过了解和分析各个…...
vulnhub five86-1
总结:私钥登录,隐藏文件很多 目录 下载地址 漏洞分析 信息收集 网站渗透 爆破密码 提权 下载地址 Five86-1.zip (Size: 865 MB)Download (Mirror): https://download.vulnhub.com/five86/Five86-1.zip使用:下载以后打开压缩包,使用vm直…...
28个案例问题分析---01---redis没有及时更新问题--Redis
redis没有及时更新问题一:背景介绍二:前期准备pom依赖连接Redis工具类连接mysql工具类三:过程使用redis缓存,缓存用户年龄业务对应流程图使用redis缓存用户年龄对应代码四:总结一:背景介绍 业务中使用redis…...
[1.3_3]计算机系统概述——系统调用
文章目录第一章 计算机系统概述系统调用(一)什么是系统调用,有何作用(二)系统调用与库函数的区别(三)小例子:为什么系统调用是必须的(四)什么功能要用到系统调…...
Vue基础学习 第一个Vue程序 el挂载点 v-指令(1)
Vue简介 Vue是一个Javascript框架Vue框架可以简化Dom操作响应式数据驱动 : 页面是由数据生成的,当数据出现改动,页面也会即时改变 第一个Vue程序 Vue中文文档官网:https://v2.cn.vuejs.org/v2/guide/ 根据官方文档的说法&#…...
前端页面性能
提升页面性能的方法资源压缩合并,减少HTTP请求非核心代码异步加载异步加载方式?1)动态脚本加载、2)defer、3)async(在加载js的时候在script标签上添加这两个属性,<script src"./test.js" charset"utf-8" defer><…...
2023-03-04 反思
摘要: 当前的时期确实比较特殊,不但是对于一个生命周期的最后的挣扎,更是在经历了各种浮浮沉沉的波澜之后还有更多的波浪。 精神分析-GRY: 非常奇怪的一个跳梁小丑, 不过我个人认为用这个标签是对跳梁小丑的侮辱和上层管理者对于这种人的纵容有很大关系…...
奇思妙想:超链接唤起本地应用
文章目录分析实现参考很多人的博客都有这样的小玩意,点击之后就可以直接与博主进行对话,而且无需添加好友。 先研究一下网页源代码: <a href"tencent://message/?uin88888888&Siteqq&Menuyes">联系我</a>很明…...
初识数据结构——“数据结构与算法”
各位CSDN的uu们你们好呀,今天小雅兰进入一个全新的内容的学习,就是算法和数据结构啦,话不多说,让我们进入数据结构的世界吧 什么是数据结构? 什么是算法? 数据结构和算法的重要性 如何学好数据结构和算…...
华为OD机试Golang解题 - 计算网络信号
华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典文章目录 华为Od必看系列使用说明本期题目…...
ESP32编译及运行错误记录
1、打印格式不对 一般都是因为日志中某个参数打印格式不匹配造成。 ESP_LOGI(TAG, "[APP] Free memory: %lu bytes", esp_get_free_heap_size());//将之前的%d 改为%lu 2、配置载不对 这里选择了蓝牙模块需要引入蓝牙组件才能编译通过 idf.py menuconfig Component…...
GEE开发之降雨(CHIRPS)数据获取和分析
GEE开发之降雨CHIRPS数据获取和分析1.数据介绍2.初识CHIRPS2.1 代码一2.2 代码二3.逐日数据分析和获取4.逐月数据分析和获取4.1 代码一4.2 代码二(简洁)5.逐年数据分析和获取5.1 代码一5.2 代码二(简洁)前言:主要获取和分析UCSB-CHG/CHIRPS/DAILY的日数据、月数据和…...
TypeScript中面向对象
面向对象 要想面向对象,操作对象,首先便要拥有对象; 要创建对象,必须要先定义类,所谓的类可以理解为对象的模型; 程序中可以根据类创建指定类型的对象; 举例来说: 可以通过Perso…...
Transformer 模型:入门详解(1)
动动发财的小手,点个赞吧! 简介 众所周知,transformer 架构是自然语言处理 (NLP) 领域的一项突破。它克服了 seq-to-seq 模型(如 RNN 等)无法捕获文本中的长期依赖性的局限性。事实证明,transformer 架构是…...
深入理解js中的new关键字
在js中我们经常会使用到new关键字,那我们在使用new关键字的时候,new到底做了什么呢?今天我们就来深入探究一下 1.初步使用 我们先来使用一下,这是一个正常操作 function Person() {this.name "John";}let person new…...
RT-Thread Nano(2) - 线程
参考:RT-Thread API参考手册: 线程管理 线程的分类:动态线程,静态线程 动态线程是系统自动从动态内存堆上分配栈空间的线程句柄(程序运行时再分配空间),静态线程是由用户分配栈空间与线程句柄(可以说是程序编译时已经分配好空间) 1.创建线程 创建一个动态线程 rt_thread_t …...
真香,Grafana开源Loki日志系统取代ELK?
一、Loki是什么? Loki是由Grafana Labs开源的一个水平可扩展、高可用性,多租户的日志聚合系统的日志聚合系统。它的设计初衷是为了解决在大规模分布式系统中,处理海量日志的问题。Loki采用了分布式的架构,并且与Prometheus、Graf…...
机器学习|多变量线性回归 | 吴恩达学习笔记
前文回顾:机器学习 | 线性回归(单变量) 目录 📚多维特征 📚多变量梯度下降 📚梯度下降法实践 🐇特征缩放 🐇学习率 📚特征和多项式回归 📚正规方程 &…...
StructBERT模型Java八股文知识库构建:面试题相似度检索与去重
StructBERT模型Java八股文知识库构建:面试题相似度检索与去重 1. 引言 如果你是负责招聘的技术面试官,或者是在线教育平台的题库维护者,下面这个场景你一定不陌生:新收集到一道关于“Java中HashMap和ConcurrentHashMap的区别”的…...
大学物理(上)-期末实战解析(5)——刚体力学核心:从转动惯量到角动量守恒的解题秘籍
1. 刚体力学入门:为什么转动惯量是解题钥匙 刚体力学是大学物理中最让人头疼的章节之一,尤其是当题目里出现"转动惯量"这个名词时,很多同学就开始手心冒汗。记得我第一次做这类题目时,盯着那个积分符号看了半小时愣是没…...
实测通义千问3-Reranker-0.6B:轻量模型如何让电商商品搜索更准确
实测通义千问3-Reranker-0.6B:轻量模型如何让电商商品搜索更准确 1. 电商搜索的痛点与解决方案 在电商平台上,用户输入"真丝连衣裙"却看到牛仔裤推荐,这种糟糕的搜索体验每天都在发生。传统搜索技术依赖关键词匹配和简单规则&…...
大麦抢票自动化终极指南:5分钟快速上手教程
大麦抢票自动化终极指南:5分钟快速上手教程 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 您是否曾因热门演唱会门票秒光而遗憾&#x…...
3分钟上手!Balena Etcher:安全烧录系统镜像的终极解决方案
3分钟上手!Balena Etcher:安全烧录系统镜像的终极解决方案 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 你是否曾因烧录系统镜像而丢失…...
# 智能合约安全实战:重入攻击原理与防御机制详解(Solidity + Foundry)在以太坊生态中,**智能合约的安全性
智能合约安全实战:重入攻击原理与防御机制详解(Solidity Foundry) 在以太坊生态中,智能合约的安全性直接决定项目的生命线。近年来频繁爆发的漏洞事件表明,即使是看似简单的逻辑也可能埋藏致命隐患。其中,…...
OpCore Simplify:三步搞定黑苹果EFI配置的智能工具
OpCore Simplify:三步搞定黑苹果EFI配置的智能工具 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果的复杂EFI配置而烦恼吗&am…...
OpenSSL实战:手把手教你创建自签名根证书
1. 为什么需要自签名根证书? 想象一下你正在搭建一个内部测试环境,或者为公司的内部系统建立一套专属的安全通信机制。这时候你会发现,所有涉及HTTPS的环节都需要SSL/TLS证书。如果直接购买商业CA颁发的证书,不仅成本高ÿ…...
零代码自动化:OpenClaw+百川2-13B实现Excel报表智能整理
零代码自动化:OpenClaw百川2-13B实现Excel报表智能整理 1. 为什么需要智能表格处理工具 每个月末,我都要面对几十张格式各异的Excel报表。供应商对账单、部门报销明细、项目进度表……这些文件总是以不同的结构出现在我的邮箱里。最痛苦的不是处理数据…...
基于yz-bijini-cosplay的.NET应用开发:AI功能集成实践
基于yz-bijini-cosplay的.NET应用开发:AI功能集成实践 1. 为什么要在.NET应用里集成cosplay风格生成能力 最近有好几位做数字内容平台的朋友问我:“我们给动漫爱好者提供社区服务,能不能在自己的App里直接生成角色同款泳装或Cosplay造型&am…...
