Могу ли я отключить исключения в STL? - PullRequest
20 голосов
/ 16 февраля 2009

Я хочу отключить исключения в своем приложении 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 или нет.

Ответы [ 3 ]

10 голосов
/ 06 октября 2010

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 ++ в настройках вашего проекта.

7 голосов
/ 16 февраля 2009

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

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

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

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

http://www.open -std.org / ОТК1 / SC22 / wg21 / документы / документы / 2007 / n2271.html

5 голосов
/ 16 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...