Как отключить исключения с плавающей запятой 100% времени в Visual Studio Native C++
Мое многопоточное нативное приложение C++ генерирует исключения INEXACT с плавающей запятой (FPE) после того, как я добавил код для одного потока для доступа к свойству в информации управления Windows (WMI) через интерфейс COM (используя CoInitalize и связанные функции). Нигде в этом добавленном коде (о котором я знаю) нет явного использования арифметики. Он просто получает значение байта из WMI.
Фактически, исключение происходит не в WMI, а в другой не связанной части потока, где действительно выполняются плавающие операции INEXACT. Но если я изменю поток выполнения, чтобы пропустить код WMI, те же самые блоки кода с операциями с плавающей запятой не генерируют исключения даже при манипулировании одними и теми же числовыми значениями.
Я попытался заблокировать исключения, выполнив следующие действия:
- Проверено, что исходная модель с плавающей точкой /fp: точная.
- Явно установите опцию /fp:exception- compiler, чтобы отключить исключения FPE
Вышеуказанное не имело никакого эффекта - исключения продолжались.
- Вставлены функции _clearfp(), за которыми следуют функции _controlfp_s(), которые очищают и маскируют исключения FP перед попыткой выполнения любой операции с плавающей запятой.
Это заблокировало исключения. Хорошо.
Однако это создает бремя необходимости помнить, чтобы сохранять и применять этот специальный режим ко всем местам, где выполняются операции с плавающей запятой. Нехорошо.
Есть ли способ, которым мы можем сделать опцию отключения (например, /fp:exception-) в флешке Visual Studio? Если нет, есть ли другой глобальный параметр или способ, который бы отключал исключения с плавающей запятой без необходимости идентифицировать и защищать каждую операцию с плавающей запятой с помощью clearfp/controlfp?