C++ std::uncaught_异常如何工作? 简介

C++ std::uncaught_异常如何工作? 简介,c++,c++11,C++,C++11,关于std::uncaught\u exception的用法和合理性,有和 该函数提供的功能归结为 std::uncaught_异常检测当前是否正在进行堆栈展开 Q 当搜索它的定义时,我看到的只是对DLL的调用 _CRTIMP2_PURE bool __CLRCALL_PURE_OR_CDECL uncaught_exception(); 强>程序中的这种内省是如何实现的?这是C++或编译器/汇编魔术实现的东西吗? ,如你所见, UNCUTTHORUCTION< /COD>是库的“语言支持”部

关于
std::uncaught\u exception
的用法和合理性,有和

该函数提供的功能归结为

std::uncaught_异常检测当前是否正在进行堆栈展开

Q 当搜索它的定义时,我看到的只是对DLL的调用

_CRTIMP2_PURE bool __CLRCALL_PURE_OR_CDECL uncaught_exception();

<>强>程序中的这种内省是如何实现的?<强>这是C++或编译器/汇编魔术实现的东西吗?

,如你所见,<代码> UNCUTTHORUCTION< /COD>是库的“语言支持”部分的一部分(第18条,[语言支持])。也就是说,它是访问核心语言某些方面所需的库特性(类似于类型标识和初始值设定项列表)

实现语言支持库通常需要特定于编译器的一组适当的编译器内部函数的知识,这些函数公开了核心语言的相关方面。(实际上,你不能真正构建一个完全编译器不可知的、“可移植的”C++标准库实现;标准库总是因为某种语言支持特性而在某种程度上与平台绑定。在第18条之外,甚至还有其他的情况,例如类型特征。
异常处理本身被内置到核心语言中,并构成编译器ABI的很大一部分;其中一部分是检测异常当前是否处于活动状态。如果在第一个异常处于活动状态时引发第二个异常,则您已经需要此信息才能终止,因此这只是以某种方式公开此状态的问题。

如您所见,
uncaught_exception
是库的“语言支持”部分的一部分(第18条,[Language.Support])。也就是说,它是访问核心语言某些方面所需的库特性(类似于类型标识和初始值设定项列表)

实现语言支持库通常需要特定于编译器的一组适当的编译器内部函数的知识,这些函数公开了核心语言的相关方面。(实际上,你不能真正构建一个完全编译器不可知的、“可移植的”C++标准库实现;标准库总是因为某种语言支持特性而在某种程度上与平台绑定。在第18条之外,甚至还有其他的情况,例如类型特征。
异常处理本身被内置到核心语言中,并构成编译器ABI的很大一部分;其中一部分是检测异常当前是否处于活动状态。如果在第一个异常处于活动状态时引发第二个异常,则您已经需要此信息才能终止,因此这只是以某种方式公开此状态的问题。

这是编译器的魔力,尽管它不需要在汇编中编写。编译器只需要能够访问作为语言运行时环境一部分的某些全局状态。该状态可能对程序不可用,但编译器知道如何访问它

有一个最初是为安腾平台编写的,但也被一些供应商在其他目标上用作事实上的标准ABI。ABI定义了不是标准C++的一部分的函数和类型,而是由符合ItAuthAB的任何C++运行环境提供的,编译器生成这些函数的调用,以实现异常处理、动态内存(DE)分配、RTTI等的功能。 该部分指定每个线程必须有一个类型为的全局结构,实现
uncaughtexception()
所需的全部工作是查看当前线程结构的
uncaughtExceptions
成员是否为非零


显然,上述细节适用于符合该ABI的编译器,但对于具有不同ABI的其他编译器,也会有类似的东西,可能不会公开发布或记录,但编译器本身可以使用。

这是编译器的魔力,尽管它不需要在汇编中编写。编译器只需要能够访问作为语言运行时环境一部分的某些全局状态。该状态可能对程序不可用,但编译器知道如何访问它

有一个最初是为安腾平台编写的,但也被一些供应商在其他目标上用作事实上的标准ABI。ABI定义了不是标准C++的一部分的函数和类型,而是由符合ItAuthAB的任何C++运行环境提供的,编译器生成这些函数的调用,以实现异常处理、动态内存(DE)分配、RTTI等的功能。 该部分指定每个线程必须有一个类型为的全局结构,实现
uncaughtexception()
所需的全部工作是查看当前线程结构的
uncaughtExceptions
成员是否为非零

显然,上面的细节适用于符合该ABI的编译器,但对于具有不同ABI的其他编译器,将有类似的内容,可能没有公开发布或记录,但编译器本身可以使用