¿Alguien sabe cómo apagar el manejo de excepciones opción en MSVC? He intentado configurar la opción ‘Habilitar las excepciones de C++’ a ‘NO’ y me puso la advertencia:
advertencia C4530: C++ excepción controlador utilizado, pero relajarse semántica no están habilitados. Especificar /EHsc.

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

En mi aplicación que básicamente necesita más velocidad que la estabilidad, por lo tanto elegí apagar el manejo de excepciones. Yo no tengo ninguna try/catch bloques, pero hago uso de la STL. Cuando me cambie la opción ‘Habilitar las excepciones de C++’ a ‘NO’ es allí cualquier manera de cómo deshacerse de esas advertencias?

InformationsquelleAutor | 2009-02-16

6 Comentarios

  1. 24

    Más probable es que usted está incluyendo uno o más encabezados estándar de C++ que contienen 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 se incluye el de que. Cualquier otra secuencia de cabecera también va a hacer, como locales.

    Si te fijas en el mensaje de error, se debe hacer referencia a dos nombres de archivo, no el archivo, y el archivo incluido con el error. E. g. en mi caso de ejemplo 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
    • Como una nota del lado, debo añadir que en realidad no hay tal cosa como ANSI/ISO C++ sin excepciones – el lenguaje de especificación de ni siquiera considerar la posibilidad de «desactivación» de ellos, y de toda la biblioteca estándar – incluyendo STL – utiliza las excepciones. Incluso los contenedores de uso, como por ejemplo, std::vector::a()
  2. 19

    Si usted realmente no quiere excepciones en la STL que estará vinculado a su programa, definir _HAS_EXCEPTIONS=0 en toda su proyecto. Mejor que compilar el código con /EHsc si usted no planea en la adición de manejo de excepciones.

    • definir _HAS_EXCEPTIONS 0 hace mi exe 4KB más grande Permitiendo excepciones convierte en otro de 4 KB de tamaño. La desactivación de la configuración y _HAS_EXCEPTIONS 0 elimina advertencia y mantiene el archivo exe menor.
  3. 4

    Que la advertencia de que significa que usted dijo que el compilador no vas a usar excepciones sin embargo, usted tiene un try {} catch() {} bloque en el código. Se le informa de que, aunque tienes que bloquear, si se produce una excepción no desctructors se van a ejecutar. Giro excepciones off significa exactamente eso – el compilador no produce código para la destrucción automática cuando la pila se desenvuelve en el caso de las excepciones.

    • Bien, he buscado en el código, pero no tengo ninguna bloques try/catch allí. Sin embargo, creo que algunas clases con los ‘nuevos’, ¿se aplica para eso también?
    • No. Esta es una advertencia del compilador, que aparece cuando se compila un solo archivo cpp. El nombre de archivo aparece justo antes de la advertencia. Ese es el archivo que contiene el código erróneo. Peor de los casos puede intentar selectivly comentario de partes del archivo para ver lo que hace la advertencia.
  4. 2

    De la desconexión de las excepciones es bastante difícil, ya que usted está tratando con C++ aquí. Es realmente en la misma categoría que la conmutación de los punteros NULL – ¿cómo vas a manejar error de asignación de memoria, por ejemplo?

    Que dijo, /EH especifica que modelo de control de excepciones que usted desea, y «ninguno» no es una opción. Usted puede escoger /EHa, /EHs /EHac y /EHsc – [a]ynchronous con o sin apoyo para lanzar extern «C» funciones.

    • hmm, no estoy de acuerdo con eso. no c++ promesa de no tener ninguna característica en él que no quiere (excepciones, RTTI)?
    • La teoría es que usted no paga por ellos, si no los uso. Es por eso que no hay ningún estándar opción para desactivarlos: el estándar de espera para ser libre si no se utiliza, por lo que nunca habrá un beneficio para apagarlos. (Una típica forma de lograr esto es una tabla mecanismo basado en la demanda, cargado cuando se produce una excepción.)
    • Este es un troll de respuesta. Yo no uso las excepciones y se pueden desactivar. Usted no está obligado a utilizar la STL bien. No es parte de la lengua.
  5. 1

    En Visual Studio, /EH se encuentra en las Propiedades de Configuración ➔ C/C++ ➔ Generación de Código ➔ Activar las Excepciones de C++.

  6. 0

    ¿Todavía tiene un bloque try/catch(s) en el código?

    La primera cosa a hacer cuando te quedas atascado es buscar el error en MSDN y/o de Google. Que por lo general ayuda. Esto es lo que MSDN dice:

    Cuando el /EHsc opción no ha sido activada, un objeto con el almacenamiento automático en el marco, entre la función de hacer el tiro y la función de la captura de la banda, no será destruida. Sin embargo, un objeto con el almacenamiento automático creado en un bloque try o catch será destruido. […]

    • Sí, eso es lo que encontró por primera vez y no tengo ni idea de lo que estoy haciendo mal, porque no tengo el vocabulario sin embargo, para entender este tres oraciones correctamente. Alguien puede explicar esta advertencia, sin RTFM por favor? Thx.
    • edit: Este sitio explica el /EHx-parámetro de MS-C++Compilador CL y da una mejor idea de lo que hace: docs.microsoft.com/en-us/cpp/build/reference/…

Dejar respuesta

Please enter your comment!
Please enter your name here