2009-02-16 6 views
18

Quiero desactivar excepciones en mi aplicación C++, compilada bajo MSVC. He cambiado la opción Habilitar excepciones de C++ a NO, pero recibo advertencias para que use la opción/Ehsc, que no quiero.¿Puedo deshabilitar excepciones en AWL?


No tengo try/catch blocks en mi código, pero utilizo STL. He encontrado que el uso de _HAS_EXCEPTIONS definición macro = 0 debe desactivar las excepciones en STL, pero todavía estoy consiguiendo 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 cómo apagar las excepciones es STL?

Nota: en mi código también quiero desactivar las opciones de RTTI. Recibo las mismas advertencias sin importar si el RTTI está encendido o apagado.

Respuesta

5

El ID de tipo tiene que ver con la identificación de tipo de tiempo de ejecución. Es posible que desee intentar desactivar RTTI también.

Sin embargo, ciertas partes de la Biblioteca estándar de C++ se especifican para lanzar excepciones. Si los deshabilitas estás navegando hacia las turbias aguas de "comportamiento indefinido".

7

Necesita utilizar un STL que admita la desactivación de excepciones. En general, esta es una definición de macro en tiempo de compilación.

A menos que esté equivocado, STLPort ofrece esto con _STLP_USE_EXCEPTIONS = 0 y _STLP_NO_EXCEPTIONS. No sé cómo se comportan los programas con estas configuraciones. ;)

Creo que hay alguna bandera oculta en el MS STL también.

El EASTL sale de la caja con excepciones para minusválidos:

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

10

Microsoft STL soporta la desactivación excepción.

Para MSVC STL que define la macro _HAS_EXCEPTIONS = 0 inhabilita las excepciones en caso de que vincule su aplicación con la opción del compilador libcmt.lib/libcmtd.lib (/ MT o/MTd).

Si enlaza con msvcrt.lib/msvcrtd.lib (opción de compilador MD// MDd) necesita definir una macro más - _STATIC_CPPLIB. En este caso, o bien añadir las siguientes líneas antes de incluir cualquier código STL:

#define _HAS_EXCEPTIONS 0 
#define _STATIC_CPPLIB 

o añadir lo siguiente a las opciones del compilador:

-D_HAS_EXCEPTIONS=0 -D_STATIC_CPPLIB 

Tenga en cuenta que es necesario deshabilitar excepciones de C++ en la configuración del proyecto.

+0

Lo que no entiendo es cuando se usa/MD o/MDd, ¿por qué necesitamos el _STATIC_CPPLIB? De lo que he podido leer hace que el código use libcmt.lib y no msvcrtd.lib. El objetivo de usar/MD es tener bibliotecas vinculadas dinámicamente y no bibliotecas vinculadas estáticas. Agregar _STATIC_CPPLIB parece frustrar el propósito de usar el indicador/MD. – gnash117

+0

_STATIC_CPPLIB está en desuso en MSVC 2010, por lo que usarlo con MSVC 2010 simplemente reemplazará un conjunto de advertencias por otro. – gnash117

+0

gnash117, MSDN para MSVC2008 dice que al usar la definición del preprocesador _STATIC_CPPLIB, su aplicación vincula libcmt.lib en lugar de msvcprt.lib, pero sigue vinculándose dinámicamente con el CRT principal a través de msvcrt.lib. – Rom098

Cuestiones relacionadas