当前位置: 首页 > 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;借助这个工具我们可以将视频中不需要的字幕或者水印删除掉。 不过这款工具每天有三次免费次数…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...