Могу ли я отключать исключения в STL?
Я хочу отключить исключения в моей С++-задаче, скомпилированной под MSVC. Я включил опцию Enable С++ exceptions в NO, но я получаю предупреждения, которые говорят мне использовать параметр /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.
Ответы
Ответ 1
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
Обратите внимание, что вам нужно отключить исключения С++ в настройках вашего проекта.
Ответ 2
Вам нужно использовать 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
Ответ 3
Идентификатор типа относится к идентификации типа времени выполнения. Вы также можете попробовать выключить RTTI.
Однако определенные части стандартной библиотеки С++ задаются для исключения исключений. Если вы отключите их, вы плывете в мутные воды "поведения undefined".