std :: uncaught_exception如何工作?

Nik*_*iou 1 c++ c++11

介绍

有关于使用和理性的帖子文章std::uncaught_exception.

功能提供的功能归结为

std :: uncaught_exception检测堆栈展开当前是否正在进行中.

Q

在搜索其定义时,我看到的是对DLL的调用

_CRTIMP2_PURE bool __CLRCALL_PURE_OR_CDECL uncaught_exception();
Run Code Online (Sandbox Code Playgroud)

如何实现程序中的这种内省水平?这是仅仅通过c ++或编译器/汇编魔法实现的东西必须发挥作用吗?

Jon*_*ely 5

它是编译器的魔力,虽然它不需要在汇编中编写.编译器必须能够访问属于语言运行时环境的某些全局状态.该状态可能对您的程序不可用,但编译器知道如何访问它.

有一个C++ ABI最初是为Itanium平台编写的,但也被其他目标上的几个供应商用作事实上的标准ABI.ABI定义了几个不属于标准C++的函数和类型,但是由符合Itanium ABI的任何C++运行时环境提供,并且编译器生成对这些函数的调用,以实现异常处理,动态等功能.内存(de)分配,RTTI等

异常处理部分指定必须有类型的全局结构__cxa_eh_globals为每个线程,并执行所有的需要uncaught_exception()就是看是否uncaughtExceptions当前线程的结构的成员是非零.

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