2009-02-16 12 views
17

¿Alguien sabe cómo desactivar la opción de manejo de excepciones en MSVC? Intenté establecer la opción 'Habilitar excepciones de C++' en 'NO' y recibí una advertencia: advertencia C4530: se utilizó el manejador de excepciones C++, pero la semántica de desenrollado no está habilitada. Especifique /EHsc.¿Cómo puedo desactivar el manejo de excepciones en MSVC?

Me gustaría desactivar el manejador de excepciones, también, pero no sé cómo.

En mi aplicación, básicamente necesito más velocidad que estabilidad, por lo tanto elegí desconectar el manejo de excepciones. No tengo ningún bloque try/catch, pero sí uso STL. Cuando cambio la opción 'Habilitar excepciones de C++' a 'NO', ¿hay alguna forma de deshacerse de esas advertencias?

Respuesta

0

¿Todavía tiene try/catch block (s) en su código?

Lo primero que debe hacer cuando se queda bloqueado es buscar el error en MSDN y/o Google. Eso usualmente ayuda. Esto es lo que dice MSDN:

When the /EHsc option has not been enabled, an object with automatic storage in the frame, between the function doing the throw and the function catching the throw, will not be destroyed. However, an object with automatic storage created in a try or catch block will be destroyed. [...]

2

Desactivar las excepciones es bastante difícil, ya que se trata de C++ aquí. Realmente está en la misma categoría que desactivar los punteros NULL. ¿Cómo va a manejar la falla de asignación de memoria, por ejemplo?

Dicho esto,/EH especifica qué modelo de manejo de excepciones desea, y "ninguno" no es una opción. Puede elegir/EHa,/EHs,/EHac y/EHsc - [a] sincrónicos con o sin soporte para lanzar funciones externas "C".

+0

hmm, no estoy de acuerdo con eso. ¿no prometió C++ no tener ninguna función que no desee (excepciones, RTTI)? – didito

+0

@didito: La teoría es que no los pagas, si no los usas.Es por eso que no hay una opción estándar para desactivarlos: el estándar espera que sean gratuitos si no se usan, por lo que nunca sería beneficioso apagarlos. (Una forma típica de lograr esto es un mecanismo basado en tablas, cargado por demanda cuando se lanza una excepción). – MSalters

+4

Esta es una respuesta troll. No uso excepciones y puedes desactivarlas. No está obligado a usar el STL tampoco. No es parte del lenguaje. – HaltingState

4

Esa advertencia significa que le dijo al compilador que no va a usar excepciones pero tiene un bloque try {} catch() {} en el código. Le informa que aunque tenga ese bloque, si se lanza una excepción, no se ejecutarán descductores. Desactivar excepciones significa exactamente eso: el compilador no produce código para la destrucción automática cuando la pila se desenrolla en el caso de una excepción.

+0

Bueno, he buscado el código, pero no tengo ningún bloque try/catch allí. Sin embargo, creo algunas clases usando 'nuevo', ¿se aplica también a eso? –

+2

No. Esta es una advertencia del compilador, aparece al compilar un solo archivo cpp. El nombre del archivo aparece justo antes de la advertencia. Ese es el archivo que contiene el código ofensivo. En el peor de los casos, puede intentar comentar selectivamente partes del archivo para ver qué causa la advertencia. – shoosh

22

Lo más probable es que incluya uno o más encabezados estándar de C++ que contengan try/catch. El caso más típico sería <iostream> - obtendrá este error en un archivo que consta de una sola línea que solo incluye eso. Cualquier otro encabezado de flujo también funcionará, al igual que las configuraciones regionales.

Si observa detenidamente el mensaje de error, debe hacer referencia a dos nombres de archivo, no uno: su archivo y el archivo incluido con el error. P.ej. en mi caso muestra de #include <iostream>, me sale esto:

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 
+4

Como nota al margen, debo agregar que realmente no hay nada como ANSI/ISO C++ sin excepciones: la especificación del lenguaje ni siquiera considera "desactivarlos", y toda la biblioteca estándar, incluido STL, usa excepciones . Incluso los contenedores los usan, p. std :: vector :: at() –

16

Si realmente no quiere excepciones en la STL, definir _HAS_EXCEPTIONS = 0 en todo el proyecto. Es mejor que compilar su código con/EHsc si no planea agregar el manejo de excepciones.

+0

define _HAS_EXCEPTIONS 0 hace que mi exe 4Kb más grande Habilitar excepciones hace que sea 4KB más grande. Al desactivar la configuración y _HAS_EXCEPTIONS 0 se elimina la advertencia y se mantiene el exe más pequeño. – slyy2048