Могу ли я отключить исключения в STL?
-
23-08-2019 - |
Вопрос
Я хочу отключить исключения в моем приложении 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++ предусмотрено создание исключений.Если вы их отключите, вы плывете в мутные воды «неопределённого поведения».