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

Как отключить обработку исключений в MSVC?

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

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

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

4b9b3361

Ответ 1

Скорее всего, вы включаете один или несколько стандартных заголовков С++, содержащих 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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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