Posso desativar exceções em STL?
-
23-08-2019 - |
Pergunta
Eu quero desativar exceções em minha aplicação C ++, compilados sob MSVC. I HVE ligado a opção Ativar exceções C ++ para NO, mas eu recebo avisos me dizendo para usar a opção / EHsc, que eu não quero.
Eu não tenho blocos try / catch no meu código, mas eu uso STL. Eu descobri que usando _HAS_EXCEPTIONS definição de macro = 0 deve desabilitar as exceções em STL, mas ainda estou recebendo aviso 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'
Existe alguma maneira como desligar as exceções é STL?
Nota: No meu código eu quero desligar as opções RTTI também. Recebo os mesmos avisos não importa se o RTTI é ligado ou desligado.
Nenhuma solução correta
Outras dicas
A Microsoft suporta STL exceção desativação.
Para MSVC STL definir _HAS_EXCEPTIONS macro = 0 desativa exceções no caso de você ligar a sua aplicação com LIBCMT.LIB / LIBCMTD.LIB (/ MT ou / opção de compilador MTD).
Se você ligar com msvcrt.lib / Msvcrtd.lib (/ MD ou opção de compilador / MDD) é preciso definir mais uma macro - _STATIC_CPPLIB. Neste caso, adicione as seguintes linhas antes de incluir qualquer código STL:
#define _HAS_EXCEPTIONS 0
#define _STATIC_CPPLIB
ou adicionar o seguinte para opções do compilador:
-D_HAS_EXCEPTIONS=0 -D_STATIC_CPPLIB
Por favor note que você precisa desativar C ++ exceções nas configurações do projeto.
Você precisa usar um STL que a desactivação suportes exceção. Isso geralmente é uma definição macro em tempo de compilação.
Se não me engano, ofertas STLport isto com _STLP_USE_EXCEPTIONS = 0 e _STLP_NO_EXCEPTIONS. Eu não sei como os programas se comportam com essas configurações. ;)
Eu acho que há alguma bandeira escondido no STL MS também.
O EASTL sai da caixa com exceções desativado:
http: //www.open- std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html
O tipo ID tem a ver com a identificação do tipo run-time. Você pode querer tentar transformar RTTI fora também.
No entanto, certas partes da biblioteca padrão C ++ são especificados para exceções lance. Se você desativá-los você está navegando nas águas turvas de "comportamento indefinido".