c++ 20 语法规范, vs2019 类 exception 的定义,在 vcruntime_exception .h

embedded/2024/11/23 18:43:22/

这个源头文件,在 STL 模板库里的其他模板的定义中,会引用到,因此,记录与注释一下。源代码很短,直接展开来,同时也附上资源 .h 文件:

//
// vcruntime_exception.h
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// <exception> functionality that is implemented in the VCRuntime.
//#pragma once#include <eh.h>#ifdef _M_CEE_PURE#include <vcruntime_new.h>
#endif#if _VCRT_COMPILER_PREPROCESSOR && _HAS_EXCEPTIONS#pragma warning(push)
//在栈中保存当前的警告状态
#pragma warning(disable: _VCRUNTIME_DISABLED_WARNINGS)#pragma pack(push, _CRT_PACKING)
//保存原先的对齐状态,并重置为 8 字节对齐_CRT_BEGIN_C_HEADER   // 在 cPP 里定义 c 代码_VCRTIMP void __cdecl __std_exception_copy  // 这像是一个函数的声明, 功能是字符串复制
(   _In_  __std_exception_data const* _From,  _Out_ __std_exception_data* _To ); // 这像是一个函数的声明,功能像是销毁堆区的字符串
void __cdecl __std_exception_destroy( _Inout_ __std_exception_data* _Data );// 此数据结构,作为下面的类 exception 的数据成员, _DoFree 初始化为 True
struct __std_exception_data { char const* _What;    bool _DoFree; };_CRT_END_C_HEADERnamespace std  // 类 exception 定义于标准命名空间 std 
{ 
#pragma warning(push)  // 保存原先的警告状态
#pragma warning(disable: 4577)   // 'noexcept' used with no exception handling mode specified
class exception
{
private:__std_exception_data _Data; // 此数据成员的定义在上面
public:exception() noexcept : _Data() { } // 默认的空初始化virtual ~exception() noexcept {  __std_exception_destroy(&_Data);  } // 父类的虚析构函数explicit exception(char const* const _Message) noexcept : _Data() // 禁止隐式类型转换{__std_exception_data _InitData = { _Message, true };__std_exception_copy(&_InitData, &_Data);}exception(char const* const _Message, int) noexcept  : _Data() { _Data._What = _Message; }//构造函数的多个版本,重载。  copy 构造函数exception(exception const& _Other) noexcept : _Data(){__std_exception_copy(&_Other._Data, &_Data);}exception& operator=(exception const& _Other) noexcept // copy 赋值运算符函数{if (this == &_Other)       return *this;__std_exception_destroy(&_Data); // 先销毁自己原来保存的字符串__std_exception_copy(&_Other._Data, &_Data);return *this;}_NODISCARD virtual char const* what() const // 父类的虚成员函数,返回本类里保存的字符串的地址{return _Data._What ? _Data._What : "Unknown exception";}};class bad_exception : public exception // 定义 exception 的子类
{
public:bad_exception() noexcept : exception("bad exception", 1) {    }
};class bad_alloc : public exception     // 定义 exception 的子类
{
public:bad_alloc() noexcept : exception("bad allocation", 1) {   }private:friend class bad_array_new_length; // 友元类bad_alloc(char const* const _Message) noexcept : exception(_Message, 1) {  } //私有的有参构造函数
};class bad_array_new_length : public bad_alloc // 孙子类
{
public:bad_array_new_length() noexcept : bad_alloc("bad array new length")  {  }
};#pragma warning(pop) // 恢复原来的警告等级} // namespace std#pragma pack(pop) // 恢复原来的对齐方式#pragma warning(pop) // _VCRUNTIME_DISABLED_WARNINGS
#endif // _VCRT_COMPILER_PREPROCESSOR && _HAS_EXCEPTIONS

谢谢


http://www.ppmy.cn/embedded/139913.html

相关文章

PyCharm的类型警告: Expected type ‘SupportsWrite[bytes]‘, got ‘BinaryIO‘ instead

记录时使用的PyCharm版本: PyCharm 2024.3 (Professional Edition) Build #PY-243.21565.199, built on November 13, 2024 问题描述 当在PyCharm里使用pickle保存文件, 比如以下代码这样: with open(meta_save_path, wb) as f:pickle.dump(meta, f)会发现PyCharm对此发出类型…

为什么芯麦的 GC4931P 可以替代A4931/Allegro 的深度对比介绍

在电机驱动芯片领域&#xff0c;芯麦 GC4931P 和 A4931 都是备受关注的产品。它们在多种应用场景中发挥着关键作用&#xff0c;今天我们就来详细对比一下这两款芯片。 一、性能参数对比 &#xff08;一&#xff09;电流输出能力 A4931 具有一定的电流输出能力&#xff0c;但芯…

JVM(五、垃圾回收器)

经典的垃圾回收器大概有7种&#xff0c;这些收集器的目标、特性、原理、使用场景都有所区别&#xff0c;有的适用于年轻代&#xff0c;有的适用于老年代&#xff0c;图中展示的就是这7中垃圾回收器&#xff0c;如果两个垃圾回收器有连线&#xff0c;则表明可以配合使用。这个关…

27、js中声明变量

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title></title> </head> <body> </body> <script> // js中声明变量用var // 变量名…

迅为RK3588开发板Android系统开发笔记允许usb调试

首先开发板烧写 Android12 系统&#xff0c;连接屏幕&#xff0c;烧写线&#xff0c;串口线&#xff0c;电源线。连接完毕后&#xff0c;接 着我们打开 usb 调试。步骤如下&#xff1a; 1.在屏幕上打开设置 app,如下图所示&#xff1a; 2 滑到最底部&#xff0c;点击“关于平…

8086汇编语言教程(入门到实践)

这里写目录标题 1.基础概念1.1. 什么是汇编语言&#xff1f;1.2. 8086微处理器简介 2.快速入门3.寄存器3.1. 8086的寄存器分类3.2. 寄存器的典型使用示例 4. 简单语法4.1. 赋值、输入输出4.2. 算数运算符4.3. 比较运算符4.4. 转移运算符4.5.逻辑命令 5. 案例5.1. 输出从 A 到 …

Linux离线安装Docker命令,简单镜像操作

解压安装包 首先&#xff0c;使用 tar 命令解压 docker-27.3.1.tgz 安装包&#xff1a; tar -zxvf docker-27.3.1.tgz 将二进制文件移动到可执行路径上的目录 接着&#xff0c;将解压出来的 Docker 二进制文件复制到系统的可执行路径&#xff08;通常是 /usr/bin/&#xff09…

socket连接封装

效果&#xff1a; class websocketMessage {constructor(params) {this.params params; // 传入的参数this.socket null;this.lockReconnect false; // 重连的锁this.socketTimer null; // 心跳this.lockTimer null; // 重连this.timeout 3000; // 发送消息this.callbac…