【发布时间】:2012-02-20 18:13:48
【问题描述】:
Stroustrup 在“C++ 的设计和演变”(Addison Wesley,1994 年)中说,“低级事件,例如算术溢出和除以零,被假定由专用的低级机制处理,而不是这使得 C++ 在算术方面能够与其他语言的行为相匹配。它还避免了在诸如除以零之类的事件是异步的大量流水线架构上发生的问题。”
Q1:如果不是异常,为什么 GCC 会报告一个而不是低级错误?
Q2:给定整数除法,为什么报告为浮点数?
鉴于我无法用 catch(...) 捕获它,这是非常具有误导性的。显然我可以测试并避免整个“错误”,但我的观点是,对于认为它可能是异常(合理)、试图捕捉它、然后发现它不是异常的初学者来说,这非常令人困惑,并想知道报告的运行时异常。
我的编译器是 gcc 版本 4.2.1(Apple Inc. build 5666)(点 3)
对 CPU 异常、FPU 异常、语言异常和操作系统异常之间的区别进行一些准确的说明可能会解决此问题。
示例程序:
int main(){
int i=1/0;
return i;
}
结果输出:
浮点异常
【问题讨论】:
-
这听起来更像是向 Apple 提交的错误报告,而不是问题......
-
问题是为什么(我的编译器)如此具有误导性。
-
@pst:问题很清楚:为什么“异常”这个词用来表示硬件和软件生成的异常,为什么
SIGFPE同时用于整数和浮点例外?不过,我不知道怎么会有人回答“为什么”。 -
时间对古老的 unix 信号名称及其描述并不友好。这不是一个可以很好扩展的方案。
标签: c++ exception divide-by-zero