在我为一个线程添加代码以通过 COM 接口(使用 CoInitalize 和相关函数)访问 Windows 管理信息 (WMI) 中的属性后,我的多线程本机 C++ 应用程序引发 INEXACT 浮点异常 (FPE)。在这个添加的代码(据我所知)中没有任何地方明确使用算术。它只是从 WMI 中检索一个字节值。
事实上,异常不是发生在 WMI 中,而是发生在线程的另一个不相关部分中,确实发生了 INEXACT 浮动操作。但是,如果我更改执行流程以跳过 WMI 代码,那么即使在操作相同的数值时,那些具有浮点运算的相同代码块也不会产生异常。
我试图通过执行以下操作来阻止异常:
- 验证原始浮点模型是 /fp:precise。
- 显式设置 /fp:except- 编译器选项以禁用 FPE 异常
以上没有效果——异常继续。
- 插入 _clearfp() 后跟 _controlfp_s() 函数,在尝试任何浮点运算之前清除和屏蔽 FP 异常。
这阻止了异常。好的。
然而,这带来了必须记住保留并将这种特殊处理应用于所有进行浮点运算的地方的负担。不好。
有没有办法让 Visual Studio 中的禁用选项(即 /fp:except-)生效?如果没有,是否有另一个全局选项或方法可以禁用浮点异常,而无需使用 clearfp/controlfp 识别和保护每个浮点操作?