考虑这个例子:
struct Nobody_Expects_The_Spanish_Inquisition{};
int main(){
throw Nobody_Expects_The_Spanish_Inquisition();
}
输出显示在Ideone http://ideone.com/bTFAd:
抛出实例后终止调用没有人期望西班牙宗教裁判所'
Windows 的类似输出:
Test.exe 中 0x760fb727 处出现未处理的异常:Microsoft C++ 异常:Nobody_Expects_The_Spanish_Inquisition 位于内存位置 0x001ffea3..
可以看出,最终的程序集似乎已经包含异常的名称,或者有另一种方法来获取该名称。
这是否可以被视为某种反思?或者,如果异常的名称实际上可以显示,它是否依赖于编译器/操作系统?
它依赖于编译器。显然,编译器很容易发现每个抛出,并将每个抛出对象的类型编码到可执行文件中。但没有要求他们必须这样做。
想想看,异常在抛出时必须被复制到一个奇怪的依赖于实现的空间中。因此,特定编译器的运行时可以通过此机制访问其类型的名称,这是有道理的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)