Puedo desactivar excepciones en STL?

Quiero deshabilitar excepciones en mi C++ aplicación, compilados bajo el MSVC. Yo hve activado la opción de Habilitar las excepciones de C++ que NO, pero me da advertencias que me dice que utilice la opción /Ehsc, que yo no quiero.


No tengo bloques try/catch en mi código, pero yo uso STL. He encontrado que el uso de definición de macro _HAS_EXCEPTIONS=0 debe deshabilitar las excepciones en STL, pero yo todavía estoy recibiendo de advertencia como:


warning C4275: non dll-interface class 'stdext::exception' used as base for dll-interface class 'std::bad_typeid'
see declaration of 'stdext::exception'
see declaration of 'std::bad_typeid'


¿Hay alguna manera de apagar las excepciones se STL?

Nota: En mi código quiero apagar el RTTI opciones, también. Tengo la misma advertencias no importa si el RTTI está encendido o apagado.

InformationsquelleAutor | 2009-02-16

3 Kommentare

  1. 10

    Microsoft STL admite la excepción de la desactivación.

    Para MSVC STL definición de macro _HAS_EXCEPTIONS=0, se deshabilita excepciones en el caso de que el enlace de la aplicación con libcmt.lib/libcmtd.lib (/MT /MTd opción del compilador).

    Si el vínculo con msvcrt.lib/msvcrtd.lib (/MD o /MDd opción del compilador) es necesario definir una macro _STATIC_CPPLIB. En este caso, agregue las siguientes líneas antes de incluir cualquier código STL:

    #define _HAS_EXCEPTIONS 0
    #define _STATIC_CPPLIB

    o agregar lo siguiente a las opciones del compilador:

    -D_HAS_EXCEPTIONS=0 -D_STATIC_CPPLIB

    Por favor, tenga en cuenta que usted necesita para deshabilitar las excepciones de C++ en la configuración del proyecto.

    • Lo que no entiendo es cuando se utiliza /MD o /MDd ¿por qué necesitamos la _STATIC_CPPLIB. Por lo que he podido leer hace que el código para utilizar libcmt.lib y no msvcrtd.lib. El punto entero de uso /MD es dinámicamente vinculadas a las bibliotecas y no estática vinculados a las bibliotecas. La adición de _STATIC_CPPLIB parece a la derrota el propósito de utilizar el /MD bandera.
    • _STATIC_CPPLIB está en desuso en MSVC 2010 por lo que se utiliza con MSVC 2010 se acaba de reemplazar un conjunto de advertencias con otro.
    • gnash117, MSDN para MSVC2008 dice que cuando el uso de _STATIC_CPPLIB definición de preprocesador su aplicación vínculos libcmt.lib en lugar de la msvcprt lib.lib, pero todavía dinámicamente los enlaces a los principales CRT a través de msvcrt.lib.
    • Y ¿qué pasaría si el contenedor stl no tiene suficiente memoria, por ejemplo? Sería justo accidente?
    • generalmente la app STL solo llamadas terminate() si no es mediante el uso de excepciones. Tenemos que usar otra manera de manejar STL errores para estos casos, por ejemplo, stackoverflow.com/questions/3870435/…
  2. 7

    Necesita usar un STL que admite la excepción de la desactivación. Esto es generalmente un tiempo de compilación definición de macro.

    A menos que me equivoco, STLPort ofrece este con _STLP_USE_EXCEPTIONS=0 y _STLP_NO_EXCEPTIONS. No sé cómo los programas se comportan con estos ajustes. 😉

    Creo que hay una parte oculta de la bandera en el MS STL así.

    La EASTL sale de la caja con la excepción de los discapacitados:

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html

  3. 5

    El tipo de identificación es que hacer con el tiempo de ejecución tipo de identificación. Puede que desee intentar darle la vuelta RTTI fuera así.

    Sin embargo, ciertas partes del Estándar de C++ Biblioteca se especifica para lanzar excepciones. Si desactiva usted está navegando en las aguas turbias de «un comportamiento indefinido».

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea