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

C++ Core Guidelines 中文版 GSL

C++ GSL(Guideline Support Library)是由 Microsoft 开发的一个开源库,旨在提供一组通用的 C++ 标准库扩展,以支持 C++ 标准委员会提出的指导原则。GSL 为 C++ 开发人员提供了许多有用的工具和类型,以帮助他们编写更安全、更高效的代码。

以下是 GSL 提供的一些重要组件和功能:

Bounds 检查:GSL 包括用于执行数组边界检查、迭代器有效性检查等的工具。这有助于避免数组越界访问和迭代器失效等问题。

  1. #include <iostream>
    #include <gsl/gsl>int main() {int data[] = {1, 2, 3, 4, 5};// 创建一个 span 对象来引用数组gsl::span<int> dataArray(data);// 使用 Expects 约定来确保数组不为空Expects(!dataArray.empty());// 检查数组边界并进行访问for (size_t i = 0; i < dataArray.size(); ++i) {std::cout << dataArray[i] << " ";}std::cout << std::endl;// 尝试越界访问数组try {int value = dataArray[dataArray.size()];  // 越界访问std::cout << "Value at index " << dataArray.size() << ": " << value << std::endl;} catch (gsl::fail_fast& ex) {std::cerr << "Caught gsl::fail_fast exception: " << ex.what() << std::endl;}return 0;
    }
    
  2. 不可变性:GSL 提供了 gsl::not_null 类型,用于表示指针或引用不能为空,从而帮助避免空指针异常。

  3. #include <iostream>
    #include <gsl/gsl>void printValue(gsl::not_null<int*> ptr) {std::cout << "The value is: " << *ptr << std::endl;
    }int main() {int value = 42;int* ptr = &value;// 传递指针给函数,使用 not_null 来确保指针不为空printValue(gsl::not_null<int*>(ptr));// 尝试传递空指针给函数int* nullPtr = nullptr;try {printValue(gsl::not_null<int*>(nullPtr));  // 这会引发错误} catch (gsl::fail_fast& ex) {std::cerr << "Caught gsl::fail_fast exception: " << ex.what() << std::endl;}return 0;
    }
    
  4. 算法和数据结构:GSL 包括一些额外的算法和数据结构,例如 span 类型,用于表示连续内存范围,并提供对该范围的安全访问。

  5. gsl::at

    实际上是一个用于访问数组或容器元素的函数。它提供了类似于标准库 at 函数的功能,但是在索引超出有效范围时,gsl::at 会触发断言而非抛出异常。

    以下是关于 gsl::at 的详细说明和代码使用示例:

    详细说明

    gsl::at 函数的语法如下:

  6. gsl::at(container, index);
    

    其中,container 是要访问的数组或容器对象,index 是要访问的元素的索引。

    当使用 gsl::at 函数时,如果索引超出了容器的有效范围,它会触发断言,导致程序终止。

    代码使用示例

    以下是一个使用 gsl::at 函数的示例代码,演示了如何安全地访问向量中的元素:

  7. #include <iostream>
    #include <gsl/gsl>
    #include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 访问向量中的元素for (int i = 0; i <= vec.size(); ++i) {std::cout << "Element at index " << i << ": ";try {std::cout << gsl::at(vec, i) << std::endl;} catch (const gsl::fail_fast& e) {std::cerr << "Out of range access: " << e.what() << std::endl;}}return 0;
    }
    
  8. 字符串视图:GSL 提供对字符串的视图类,如 string_span,用于安全地引用字符串而无需复制数据。

  9. 用于提供一种轻量级、非拥有式的字符串访问方式。这些视图类可以用于在不复制字符串内容的情况下进行字符串操作和访问,从而提高性能并减少内存开销。

    在 GSL 中,提供了两个主要的字符串视图类:gsl::cstring_spangsl::string_span。它们分别用于 C 风格字符串和 C++ 标准库字符串的视图。以下是关于这两个类的详细说明和代码使用示例:

    gsl::cstring_span 类

    gsl::cstring_span 类用于表示对 C 风格字符串的非拥有式视图,允许对字符串进行安全的访问和操作,而无需复制字符串内容。

    详细说明

    gsl::cstring_span 的基本用法如下:

    gsl::cstring_span strSpan = "Hello, GSL!";
    

    gsl::string_span 类

    gsl::string_span 类用于表示对 C++ 标准库字符串的非拥有式视图,同样允许对字符串进行安全的访问和操作,而无需复制字符串内容。

    详细说明

    gsl::string_span 的基本用法如下:

  10. std::string str = "Hello, GSL!";
    gsl::string_span strSpan = str;
    

    代码使用示例

    以下是一个简单的示例代码,演示了如何使用 gsl::cstring_spangsl::string_span 类来创建字符串视图并进行访问操作:

  11. #include <iostream>
    #include <gsl/gsl>int main() {// 使用 gsl::cstring_span 访问 C 风格字符串gsl::cstring_span strSpanC = "Hello, GSL!";std::cout << "String view using gsl::cstring_span: " << strSpanC << std::endl;// 使用 gsl::string_span 访问 C++ 标准库字符串std::string str = "Hello, GSL!";gsl::string_span strSpan = str;std::cout << "String view using gsl::string_span: " << strSpan << std::endl;return 0;
    }
    
  12. 约定:GSL 引入了一些编程约定,如 ExpectsEnsures,用于在代码中明确表达前置条件和后置条件。

  13. Expects 宏

  14. Expects 宏用于指定函数或代码块执行前的先决条件,如果先决条件不满足,将导致程序终止。通常用于检查参数的有效性或函数执行前的必要条件。

    详细说明

    Expects 宏的基本用法如下:

  15. #include <gsl/gsl>
    void example_function(int value) {Expects(value > 0 && "Value must be greater than 0");// 函数的其他逻辑
    }
    

    Ensures 宏

    Ensures 宏用于指定函数执行后的后置条件,如果后置条件不满足,同样会导致程序终止。通常用于确保函数执行后的状态或结果。

    详细说明

    Ensures 宏的基本用法如下:

  16. #include <gsl/gsl>
    int example_function(int input) {int result = input * 2;Ensures(result > 0 && "Result must be greater than 0");return result;
    }
    

    代码使用示例

    以下是一个简单的示例代码,演示了如何使用 ExpectsEnsures 宏来进行先决条件和后置条件检查:

  17. #include <iostream>
    #include <gsl/gsl>void divide(int dividend, int divisor) {Expects(divisor != 0 && "Divisor cannot be zero");int result = dividend / divisor;Ensures(result >= 0 && "Result must be non-negative");std::cout << "Result of division: " << result << std::endl;
    }int main() {divide(10, 2);divide(20, 0); // 这里违反了 Expects 的先决条件,将导致程序终止return 0;
    }
    

对于 C++ 开发人员来说,GSL 是一个非常有用的工具库,可以帮助他们编写更加健壮和安全的代码。它有助于避免常见的程序错误,如空指针访问、越界访问等,并通过引入新的类型和约定,提高了代码的可读性和可维护性。

相关文章:

C++ Core Guidelines 中文版 GSL

C GSL&#xff08;Guideline Support Library&#xff09;是由 Microsoft 开发的一个开源库&#xff0c;旨在提供一组通用的 C 标准库扩展&#xff0c;以支持 C 标准委员会提出的指导原则。GSL 为 C 开发人员提供了许多有用的工具和类型&#xff0c;以帮助他们编写更安全、更高…...

同时显示上下两层凸包特征的可视化程序

数据类型 std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> hulls_k_upper std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> hulls_k_lower std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> hulls_underk_upper std::vector<…...

Django框架之模型层(二)

【十二】Django中如何开启事务 事务是MySQL数据库中得一个重要概念 事务的目的&#xff1a;为了保证多个SQL语句执行成功&#xff0c;执行失败&#xff0c;前后保持一致&#xff0c;保证数据安全 【1】ACID是数据库事务的四个关键特性 它代表了原子性(Atomicity)、…...

C++之list

C之list list的构造 #include <iostream> #include<list> using namespace std;//打印函数 void printfList(const list<int>&L) {for(list<int>::const_iterator it L.begin();it ! L.end();it){cout<<*it<<" ";}cout<…...

C语言日记——调试篇

一、调试调试的基本步骤 发现程序错误的存在 以隔离、消除等方式对错误进行定位 确定错误产生的原因 提出纠正错误的解决办法 对程序错误予以改正&#xff0c;重新测试 二、Debug和Release Debug通常称为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化…...

【python】Django——templates模板、静态文件、django模板语法、请求和响应

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 Django——templates模板、静态文件、djang…...

Android设计模式--观察者模式

时间是一只藏在黑暗中温柔的手&#xff0c;在你一出神一恍惚之间&#xff0c;物走星移 一&#xff0c;定义 观察者模式是定义对象间一种一对多的依赖关系&#xff0c;使得每当一个对象改变状态&#xff0c;则所有依赖于它的对象都会得到通知并被自动更新 字面意思很好理解&am…...

【Linux】Ubuntu16.04下安装python高版本--源码安装

Ubuntu16.04下完美安装python高版本及对应版本的pip 方法一:直接用命令安装python3.6&#xff08;但我没安装成功&#xff09; 好像是因为Ubuntu16.04的软件仓库&#xff08;源&#xff09;中python的最高版本就是python3.5&#xff0c;所以无法直接用apt来安装 #方法一 sudo…...

变长子网划分问题的二叉树解法

计网的变长子网划分、计组的变长操作码划分、数据结构的哈夫曼编码&#xff0c;都是前缀编码的本质&#xff08;变长操作码的二叉树解法我还在琢磨中&#xff09; 【二叉树解法】每条从叶结点到根节点的路径上有且只有一个被分配的结点&#xff1a; 【例】现将一个IP网络划分成…...

编译安装redis及配置多实例

yum安装是这种十分简单的方法我们就不在提及了&#xff0c;今天我们来做一下redis的编译安装 Redis源码包官方下载链接&#xff1a;http://download.redis.io/releases/ 一、编译安装&#xff1a; 安装依赖包 dnf -y install make gcc jemalloc-devel systemd-devel如果是…...

网络(一)总纲

一 总纲 ① 背景 1、该资料不管是在华为内部还是外部都是很出名的2、该教程仅仅作为个人笔记,形成自己的网络知识体系,自己会按照教程手把手做实验,copy图谱备注&#xff1a; 自己没有处理过物理网和虚拟网,所以会以一个小白的角度去理解,可能存在偏差3、立足点&#xff1a…...

WPF中的App类介绍

在WPF (Windows Presentation Foundation) 应用程序中&#xff0c;App 类扮演着很重要的角色。这个类通常在每个WPF应用程序中都会有&#xff0c;并且生成在App.xaml文件和其代码后台App.xaml.cs中。App类通常继承自System.Windows.Application类&#xff0c;并且有以下的主要职…...

.nc格式文件的显示及特殊裁剪方式

最近我们遇到一个nc格式的文件&#xff0c;需要将它做成报告插图&#xff0c;bing搜索一番以后&#xff0c;了解到nc的全名为NetCDF(network Common Data Form)&#xff0c;是一种网络通用数据格式&#xff0c;广泛用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。…...

为什么需要线程池?C++如何实现一个线程池?

为什么需要线程池&#xff1f;C如何实现一个线程池&#xff1f; 为什么需要线程池&#xff1f;C如何实现一个线程池&#xff1f;...

多视图聚类的论文阅读

当聚类的方式使用的是某一类预定义好的相似性度量时&#xff0c; 会出现如下情况&#xff1a; 数据聚类方面取得了成功&#xff0c;但它们通常依赖于预定义的相似性度量&#xff0c;而这些度量受原始方法的影响:当输入维数相对较高时&#xff0c;往往是无效的。 1. Deep Mult…...

shell脚本适用场景

1.适用场景 Shell脚本是一种用于自动化和批量处理任务的脚本语言。它通常在Unix/Linux系统中使用&#xff0c;并且被广泛应用于各种场景&#xff0c;包括但不限于以下几个方面&#xff1a; 自动化任务&#xff1a;Shell脚本可以用于编写自动化脚本&#xff0c;完成一系列重复性…...

Bash openldap同步AD组织数据

将AD的ou同步到openldap&#xff08;可支持全量同步和增量同步&#xff09; 整体思路如下&#xff1a; 从ad导出所有的数据&#xff0c;然后进行参数替换以及处理&#xff0c;处理后的文件称为A&#xff1b;从openldap导出所有的数据&#xff0c;然后进行参数替换以及处理&am…...

C#WPF文本转语音实例

本文介绍C#WPF文本转语音实例 实现方法:使用类库(SpeechSynthesizer )实现的。 一、首先是安装程序包。 二、创建项目 需要添加引用using System.Speech.Synthesis; UI界面 <Windowx:Class="TextToSpeechDemo.MainWindow"xmlns="http://schemas.micr…...

08-流媒体-RTMP拉流

整体方案&#xff1a; 采集端&#xff1a;摄像头采集&#xff08;YUV&#xff09;->编码&#xff08;YUV转H264&#xff09;->写封装&#xff08;&#xff28;264转FLV&#xff09;->RTMP推流 客户端&#xff1a;RTMP拉流->解封装&#xff08;FLV转H264&#xff09…...

一键免费去除视频水印和字幕的AI工具

最近有学员经常让我分享好用的智能抹除视频水印字幕AI工具&#xff0c;今天就给大家分享一个我经常用到的这款工具——腾讯智影&#xff0c;这个平台提供的智能抹除功能&#xff0c;借助这个工具我们可以将视频中不需要的字幕或者水印删除掉。 不过这款工具每天有三次免费次数…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...

python打卡day49@浙大疏锦行

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...

PLC入门【4】基本指令2(SET RST)

04 基本指令2 PLC编程第四课基本指令(2) 1、运用上接课所学的基本指令完成个简单的实例编程。 2、学习SET--置位指令 3、RST--复位指令 打开软件(FX-TRN-BEG-C)&#xff0c;从 文件 - 主画面&#xff0c;“B: 让我们学习基本的”- “B-3.控制优先程序”。 点击“梯形图编辑”…...

SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动

飞书文档https://x509p6c8to.feishu.cn/wiki/SKZzwIRH3i7lsckUOlzcuJsdnVf I2S简介 I2S&#xff08;Inter-Integrated Circuit Sound&#xff09;是一种用于传输数字音频数据的通信协议&#xff0c;广泛应用于音频设备中。 ESP32-S3 包含 2 个 I2S 外设&#xff0c;通过配置…...