Как отключить обработку исключений в MSVC?
Кто-нибудь знает, как отключить опцию обработки исключений в MSVC? Я попытался установить параметр "Включить исключения С++" на "НЕТ", и я получил предупреждение:
предупреждение C4530: используется обработчик исключений С++, но семантика развязки не включена. Укажите /EHsc
.
Я также хотел бы отключить обработчик исключений, но я не знаю, как это сделать.
В моем приложении мне требуется больше скорости, чем стабильность, поэтому я решил отключить обработку исключений. У меня нет блоков try
/catch
, но я использую STL. Когда я переключаю параметр "Включить исключения С++" на "НЕТ", есть ли способ избавиться от этих предупреждений?
Ответы
Ответ 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, будет уничтожен. [...]
Ответ 6
Здесь вы получите хорошее объяснение: - http://msdn.microsoft.com/en-us/library/1deeycx5.aspx
Чтобы решить эту ошибку:
// C4530.cpp
// compile with: /W1
int main() {
try{} catch(int*) {} // C4530
}
Источник: http://msdn.microsoft.com/en-us/library/2axwkyt4.aspx