Как я могу отключить обработку исключений в MSVC? - PullRequest
20 голосов
/ 16 февраля 2009

Кто-нибудь знает, как отключить опцию обработки исключений в MSVC? Я попытался установить для параметра «Включить исключения C ++» значение «НЕТ» и получил предупреждение: предупреждение C4530: обработчик исключений C ++ используется, но семантика раскрутки не включена. Укажите /EHsc.

Я бы тоже хотел отключить обработчик исключений, но не знаю как.

В моем приложении мне нужно больше скорости, чем стабильности, поэтому я выбрал отключение обработки исключений. У меня нет блоков try / catch, но я использую STL. Когда я переключаю опцию «Включить исключения C ++» на «НЕТ», есть ли способ избавиться от этих предупреждений?

Ответы [ 6 ]

24 голосов
/ 08 июля 2009

Скорее всего, вы включаете один или несколько стандартных заголовков C ++, которые содержат try / catch. Наиболее типичным случаем будет <iostream> - вы получите эту ошибку в файле, который состоит из одной строки, которая просто включает это. Также подойдет любой другой заголовок потока, как и локали.

Если вы внимательно посмотрите на сообщение об ошибке, оно должно ссылаться на два имени файла, а не на одно - ваш файл, и включенный файл с ошибкой. Например. в моем примере #include <iostream> я получаю это:

except.cpp
C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
19 голосов
/ 18 декабря 2012

Если вы действительно не хотите исключений в STL, которые будут связаны с вашей программой, определите _HAS_EXCEPTIONS=0 во всем вашем проекте. Лучше, чем компилировать код с помощью /EHsc, если вы не планируете добавлять обработку исключений.

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

Это предупреждение означает, что вы сказали компилятору, что не собираетесь использовать исключения, но у вас есть блок try {} catch() {} в коде. Он информирует вас о том, что, хотя у вас есть этот блок, если выдается исключение, никакие дескрипторы не будут выполняться. Отключение исключений означает именно это - компилятор не создает код для автоматического уничтожения, когда стек разматывается в случае исключений.

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

Отключить исключения довольно сложно, так как здесь вы имеете дело с C ++. Это действительно в той же категории, что и отключение указателей NULL - как вы собираетесь обрабатывать ошибки выделения памяти, например?

Тем не менее, / EH указывает , какую модель обработки исключений вы хотите, и "none" не является опцией. Вы можете выбрать / EHa, / EHs, / EHac и / EHsc - [a] синхронно с поддержкой или без поддержки броска внешних функций "C".

1 голос
/ 24 марта 2018

В Visual Studio /EH находится в свойствах конфигурации ➔ C / C ++ ➔ Генерация кода ➔ Включить исключения C ++.

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

У вас все еще есть блоки try / catch в вашем коде?

Первое, что нужно сделать, когда вы застряли, - найти ошибку в MSDN и / или Google для ее обнаружения. Это обычно помогает. Вот что говорит MSDN:

Если опция / EHsc не была включена, объект с автоматическим сохранением в кадре, между функцией, выполняющей бросок, и функцией, выполняющей бросок, не будет уничтожен. Однако объект с автоматическим хранением, созданный в блоке try или catch, будет уничтожен. [...]

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