Вопрос

Я хочу отключить исключения в моем приложении C++, скомпилированном под MSVC.Я переключил параметр «Включить исключения C++» на «НЕТ», но получаю предупреждения о необходимости использовать параметр /Ehsc, чего я не хочу.


В моем коде нет блоков try/catch, но я использую STL.Я обнаружил, что использование определения макроса _HAS_EXCEPTIONS=0 должно отключить исключения в STL, но я все равно получаю предупреждение типа:


warning C4275: non dll-interface class 'stdext::exception' used as base for dll-interface class 'std::bad_typeid' see declaration of 'stdext::exception' see declaration of 'std::bad_typeid'


Есть ли способ отключить исключения в STL?

Примечание:В моем коде я также хочу отключить параметры RTTI.Я получаю одни и те же предупреждения независимо от того, включен или выключен RTTI.

Нет правильного решения

Другие советы

Microsoft STL поддерживает деактивацию исключений.

Для определения макроса MSVC STL _HAS_EXCEPTIONS=0 отключает исключения в случае, если вы связываете свое приложение с libcmt.lib/libcmtd.lib (параметр компилятора /MT или /MTd).

Если вы связываетесь с msvcrt.lib/msvcrtd.lib (опция компилятора /MD или /MDd), вам необходимо определить еще один макрос — _STATIC_CPPLIB.В этом случае добавьте следующие строки перед включением любого кода STL:

#define _HAS_EXCEPTIONS 0
#define _STATIC_CPPLIB

или добавьте следующее в параметры компилятора:

-D_HAS_EXCEPTIONS=0 -D_STATIC_CPPLIB

Обратите внимание, что вам необходимо отключить исключения C++ в настройках вашего проекта.

Вам необходимо использовать STL, который поддерживает деактивацию исключений.Обычно это определение макроса во время компиляции.

Если я не ошибаюсь, STLPort предлагает это с _STLP_USE_EXCEPTIONS=0 и _STLP_NO_EXCEPTIONS.Я не знаю, как программы ведут себя с такими настройками.;)

Я думаю, что в MS STL тоже есть какой-то скрытый флаг.

EASTL поставляется из коробки с отключенными исключениями:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html

Идентификатор типа связан с идентификацией типа во время выполнения.Вы также можете попробовать отключить RTTI.

Однако в некоторых частях стандартной библиотеки C++ предусмотрено создание исключений.Если вы их отключите, вы плывете в мутные воды «неопределённого поведения».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top