Подтвердить что ты не робот

Могу ли я отключать исключения в 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.

4b9b3361

Ответ 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".