C++11 新特性 ---- 静态断言 static_assert

news2024/9/24 20:32:59

1.断言 assert

在C++11中,您可以使用assert关键字来检查运行时条件是否满足。assert声明了一个断言,它将在运行时检查给定的条件是否成立。如果条件不成立,将输出一个错误消息并可能终止程序。

在程序中包含头文件<cassert> <assert.h>,头文件中为我们提供了assert宏,用于在运行时进行断言。

作用:用于排除在设计的逻辑上不应该产生的情况

比如:一个函数总需要输入在一定的范围内的参数,那么程序员就可以对该参数使用断言,以迫使在该参数发生异常的时候程序退出,从而避免程序陷入逻辑的混乱

以下是一个使用assert的示例:

【例子1】

#include <iostream>
#include <cassert>

int main() {
 int x = 10;
 int y = 20;

 assert(x > y);

 return 0;
}

在这个例子中,我们使用assert来检查x是否大于y。如果条件不成立,将输出错误消息并可能终止程序。

【例子2】

#include <iostream>
#include <cassert>
#include <string>
#include <string.h>

using namespace std;

// 创建一个指定大小的 char 类型数组
char* createArr(int size) {
    // 通过断言判断数组大小是否大于0
    assert(size > 0);// 必须大于0,否则程序中断
    char* arr = new char[size];
    return arr;
}

int main() {
    char str[] = "Hello, World!";
    char* dest = createArr(0);

    copy(str, str + strlen(str), dest);
    // strcpy(dest,str);
    dest[strlen(str)] = '\0';
    delete[] dest;
    return 0;
}
heheda@heheda:~/Linux/c++11$ g++ -std=c++11 7.静态断言static_assert.cpp -o app
heheda@heheda:~/Linux/c++11$ ./app
app: 7.静态断言static_assert.cpp:26: char* createArr(int): Assertion `size > 0' failed.
已放弃 (核心已转储)

【总结】断言assert(expression)是一个宏,它的参数是一个表达式。这个表达式通常返回一个布尔类型的值,并且要求表达式必须为 true,程序才能继续向下执行,否则会直接中断

2.静态断言

静态断言(static_assert)是C++11中引入的一个编译时检查工具,用于检查编译时条件是否满足。与assert不同,静态断言不会导致程序终止,而只是生成一个编译时错误。当条件不满足时,静态断言将输出一个错误消息。

 静态断言

    ① 在编译时能够进行检查的断言

    ② 使用时不需要引用头文件

    ③ 可以自定义违反断言时的错误提示信息

    ④ 使用起来非常简单,它接收两个参数

        - 参数1:断言表达式,这个表达式通常需要返回一个 bool值

        - 参数2:警告信息,它通常就是一段字符串,在违反断言(表达式为false)时提示该信息

static_assert的参数分为两部分一个是条件,另一个是错误消息。

🦝① 条件是一个布尔式,用于检查编译时条件是否满足

🦝② 错误消息是一个字符串,用于描述不满足条件的情况

static_assert(condition, message);

例如:

static_assert(sizeof(int) < sizeof(unsigned int), "int is not smaller than unsigned int");

在这个例子中,我们使用了静态断言来检查int的大小是否小于unsigned int的大小,如果不成立,将输出错误消息 "int is not smaller than unsigned int"

在C++11中,您可以使用static_assert来检查编译时条件是否满足。static_assert声明了一个静态断言,它将在编译时检查给定的条件是否成立。如果条件不成立,将引发编译时错误。

以下是一个使用static_assert检查整数类型大小的示例:

【例子1】

#include <iostream>
#include <type_traits>

template <typename T>
void print_size() {
   std::cout << "Size of " << typeid(T).name() << ": " << sizeof(T) << std::endl;
}

int main() {
   print_size<int>();
   print_size<unsigned int>();
   print_size<long long>();

   static_assert(sizeof(int) < sizeof(unsigned int), "int is not smaller than unsigned int");

   return 0;
}

在这个例子中,我们定义了一个名为print_size的模板函数,它接受一个类型参数T。在main函数中,我们调用print_size来打印类型intunsigned intlong long的大小。然后,我们使用static_assert来检查int的大小是否小于unsigned int的大小,如果不成立,将引发编译时错误。

静态断言表达式的结果是一个布尔值。如果表达式为真,那么程序将继续正常编译和运行。如果表达式为假,那么程序将因为断言失败而终止。因此,静态断言表达式应该确保编译时条件成立,以便正确编译程序。

#include <iostream>
using namespace std;

int main() {
    // static_assert(sizeof(long) == 4, "错误, 不是32位平台"); // error: static assertion failed: 错误, 不是32位平台
    static_assert(sizeof(long) == 8, "错误, 不是32位平台");
    cout << "64bit Linux 指针大小: " << sizeof(char*) << endl;
    cout << "64bit Linux long 大小: " << sizeof(long) <<endl;
    return 0;
}

在64位的Linux操作系统下,运行这个程序。如果static_assert的条件是sizeof(long) == 4,那么会编译的时候会出现如下错误:

如果static_assert的条件是sizeof(long) == 8,那么编译不会出错

64bit Linux 指针大小: 8
64bit Linux long 大小: 8

🦥静态断言与断言的区别:

🦝① assert是一个运行时断言,只有在程序运行时才能起作用。也就是说不运行程序就无法得知某些条件是否是成立的。

🦝② 静态断言的表达式是在编译阶段进行检测

【注意点】

🦝① 由于静态断言的表达式是在编译阶段进行检测,所以在它的表达式中不能出现变量,也就是说这个表达式必须是常量表达式。

🦝② 静态断言的条件不能包含函数调用、成员访问或其他运行时操作,因为这些操作只能在运行时执行,而静态断言是在编译时检查条件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/908029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

axios 各种方式的请求 示例

GET请求 示例一&#xff1a; 服务端代码 GetMapping("/f11") public String f11(Integer pageNum, Integer pageSize) {return pageNum " : " pageSize; }前端代码 <template><div class"home"><button click"getFun1…

ARM--day7(cortex_M4核LED实验流程、异常源、异常处理模式、异常向量表、异常处理流程、软中断编程、cortex_A7核中断实验)

软中断代码&#xff1a;&#xff08;keil软件&#xff09; .text .global _start _start:1.构建异常向量表b resetb undef_interruptb software_interruptb prefetch_dataabortb data_abortb .b irqb fiq reset:2.系统一上电&#xff0c;程序运行在SVC模式1>>初始化SVC模…

pytorch lightning和pytorch版本对应

参见官方文档&#xff1a; https://lightning.ai/docs/pytorch/latest/versioning.html#compatibility-matrix 下图左一列&#xff08;lightning.pytorch&#xff09;安装命令&#xff1a;pip install lightning --use-feature2020-resolver 下图左一列&#xff08;pytorch_lig…

MySQL——基础——外连接

一、外连接查询语法&#xff1a;(实际开发中,左外连接的使用频率要高于右外连接) 左外连接 SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件...; 相当于查询表1(左表)的所有数据 包含 表1和表2交集部分的数据 右外连接 SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN …

在Qt窗口中添加右键菜单

在Qt窗口中添加右键菜单 基于鼠标的事件实现流程demo 基于窗口的菜单策略实现Qt::DefaultContextMenuQt::ActionsContextMenuQt::CustomContextMenu信号API 基于鼠标的事件实现 流程 需要使用:事件处理器函数(回调函数) 在当前窗口类中重写鼠标操作相关的的事件处理器函数&a…

Python支持下最新Noah-MP陆面模式站点、区域模拟及可视化分析技术教程

详情点击公众号链接&#xff1a;Python支持下最新Noah-MP陆面模式站点、区域模拟及可视化分析技术教程 Noah-MP 5.0模型&模型所需环境的搭建 陆面过程的主要研究内容&#xff08;陆表能量平衡、水循环、碳循环等&#xff09;&#xff0c;陆面过程研究的重要性。 图 1 陆面…

MyBatis-Plus快速开始[MyBatis-Plus系列] - 第482篇

悟纤&#xff1a;师傅&#xff0c;MyBatis-Plus被你介绍的这么神乎其乎&#xff0c;咱们还是来的点实际的吧。 师傅&#xff1a;那真是必须的&#xff0c;学习技术常用的一种方法&#xff0c;就是实践。 悟纤&#xff1a;贱贱更健康。 师傅&#xff1a;这… 师傅&#xff1a;…

”源启,征程“新员工入职考试题及答案

中电金信&#xff0c;新员工入职必修课《源启&#xff0c;征程》考试题及答案。 源启&#xff0c;征程 单选题&#xff0c;每题仅有一个正确的选项.&#xff08;本题型共有5题&#xff09; 1.“源启”诞生的背景是什么&#xff1f;&#xff08;10分&#xff09; A、国际关系…

macbook 加载模型报错:failed to load model

环境&#xff1a;macbook m1 conda python3.9 加载模型链接为&#xff1a;ggml-model-q4_0.bin 加载方式&#xff1a; from langchain.embeddings import LlamaCppEmbeddings embeddings LlamaCppEmbeddings(model_pathllama_path) 在linux上加载是正常的&#xff0c;但是…

互联网医院|线上医疗提升就医效率

互联网医院是一款在线医疗服务平台&#xff0c;旨在解决患者就医难、看病贵的问题。通过该应用&#xff0c;用户可以在线咨询医生、挂号就医、获取医疗信息和健康管理等服务&#xff0c;随着这几年人们对于线上医疗的认可&#xff0c;互联网医院系统功能也越来越完善&#xff0…

(二)Linux中安装docker(一篇就够)

一、安装docker &#xff08;1&#xff09;卸载系统之前的 docker 复制以下下命令执行&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine执行结果&…

使用vscode编写插件-php语言

https://blog.csdn.net/qq_45701130/article/details/125206645 一、环境搭建 1、安装 Visual Studio Code 2、安装 Node.js 3、安装 Git 4、安装生产插件代码的工具&#xff1a;npm install -g yo generator-code 二、创建工程 yo code 选择项解释&#xff1a; 选择编写扩…

Docker数据管理、网络通信和镜像创建

一、Docker 数据管理1、数据卷2、数据卷容器3、端口映射4、容器互联 二、Docker 镜像的创建1、基于现有的镜像创建1.1 首先启动一个镜像&#xff0c;在容器里做修改1.2 然后将修改后的容器提交为新的镜像&#xff0c;需要使用该容器的 ID 号创建新镜像 2、基于本地的模版创建3、…

RunnerGo中WebSocket、Dubbo、TCP/IP三种协议接口测试详解

大家好&#xff0c;RunnerGo作为一款一站式测试平台不断为用户提供更好的使用体验&#xff0c;最近得知RunnerGo新增对&#xff0c;WebSocket、Dubbo、TCP/IP&#xff0c;三种协议API的测试支持&#xff0c;本篇文章跟大家分享一下使用方法。 WebSocket协议 WebSocket 是一种…

【LeetCode】538.把二叉搜索树转换为累加树

题目 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下&#xff0c;二叉搜索树满足下列约束条件…

NAS个人云存储 - 手把手教你搭建Nextcloud个人云盘并实现公网远程访问

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

VSCode好用的插件

文章目录 前言1.Snippet Creator & easy snippet&#xff08;自定义代码&#xff09;2.Indent Rainbow&#xff08;代码缩进&#xff09;3.Chinese (Simplified) Language Pack&#xff08;中文包&#xff09;4.Path Intellisense&#xff08;路径提示&#xff09;5.Beauti…

GitKraken 详细图文教程

前言 写这篇文章的原因是组内的产品和美术同学&#xff0c;开始参与到git工作流中&#xff0c;但是网上又没有找到一个比较详细的使用教程&#xff0c;所以干脆就自己写了一个[doge]。文章的内容比较基础&#xff0c;介绍了Git内的一些基础概念和基本操作&#xff0c;适合零基…

游戏反外挂方案解析

近年来&#xff0c;游戏市场高速发展&#xff0c;随之而来的还有图谋利益的游戏黑产。在利益吸引下&#xff0c;游戏黑产扩张迅猛&#xff0c;已发展成具有庞大规模的产业链&#xff0c;市面上游戏受其侵扰的案例屡见不鲜。 据《FairGuard游戏安全2022年度报告》数据统计&…

明星翻包口播介绍产品视频的创意与实践

在当前社交媒体充斥着各种内容的时代&#xff0c;创意而有趣的内容形式成为品牌吸引受众目光的关键。明星翻包口播介绍产品视频&#xff0c;作为一种新颖的内容形式&#xff0c;不仅满足了观众对明星生活的好奇心&#xff0c;还将产品介绍融入其中&#xff0c;为品牌推广带来全…