是否可以在运行时检查msvcrt.dll中的_controlfp_s?

时间:2015-02-04 05:25:08

标签: c++ windows mingw

我正在Windows上编译一个MinGW程序(在这种情况下是Windows 8.1),我想要抛出浮点错误的信号。出于某种原因,我必须使用_controlfp_s来启用这些信号(其他信号都不需要这样的信号,出于某种原因只有浮点错误),同时调用SetUnhandledExceptionFilter来获取异常所以我可以做一些事情,比如获得堆栈跟踪等......在我正在编译/测试的Windows版本上,这不是问题。但是,显然较旧版本的msvcrt.dll(例如Windows XP上的版本)不包含_controlfp_s的条目,因此导致程序崩溃,因为它无法在CRT图书馆。

我的目标是使我的程序“跨平台”,以便在我正在测试的更新版本的Windows中:正确调用_controlfp_s并获取浮点错误信号,以及XP等旧版本什么都没有被调用,我们继续我们的快乐方式,没有EXCEPTION_FLT_INVALID_OPERATION或EXCEPTION_FLT_DIVIDE_BY_ZERO异常被抛出..:')

这甚至可能吗?有没有其他方法可以做到这一点,不涉及无法抛出/捕获浮点异常?

我已经检查了SO&谷歌。 MSDN完全没用。

1 个答案:

答案 0 :(得分:1)

如果您来自Linux世界,那么在Windows上,操作系统和已安装的应用程序之间存在明显的分离,这可能会让您大吃一惊。

“浮点异常的信号”确实不是操作系统关注的问题。这是每个应用程序的责任,假设它们甚至用一种有意义的语言编写。

Windows XP上的“msvcrt.dll”不是正常的Visual Studio版本,它是Windows内部版本。当然,我之前说过Windows不关心您使用的编程语言,但它本身使用的是C和C ++。这是一个你不能依赖的实现细节。

MinGW,极简主义, 依赖于它找到的任何库。它可能会找到一个完全没有代码来生成浮点异常信号的MSVCRT(为什么操作系统还需要这个?为什么Windows需要任何信号?它不是UNIX。)

我建议你坚持使用所有Windows版本的SEH。这是本机机制,从XP到10将起作用。