2009-02-16 4 views
18

Voglio disabilitare le eccezioni nella mia applicazione C++, compilato in MSVC. Ho attivato l'opzione Abilita eccezioni C++ su NO, ma ricevo avvertenze che mi dicono di usare l'opzione/Ehsc, che non desidero.Posso disabilitare le eccezioni in AWL?


Non ho try/catch blocchi nel mio codice, ma io uso STL. Ho scoperto che usando _HAS_EXCEPTIONS macro definizione = 0 dovrebbe disabilitare le eccezioni di cui STL, ma sto ancora ricevendo avvertimento come:


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'


C'è un modo come spegnere le eccezioni è STL?

Nota: nel mio codice voglio anche disattivare le opzioni RTTI. Ricevo gli stessi avvertimenti, non importa se RTTI è acceso o spento.

risposta

5

L'id del tipo ha a che fare con l'identificazione del tipo di runtime. Potresti provare a spegnere anche RTTI.

Tuttavia, alcune parti della libreria standard C++ vengono specificate per generare eccezioni. Se li disabiliti, navighi nelle acque torbide di "comportamento indefinito".

7

È necessario utilizzare un AWL che supporti la disattivazione delle eccezioni. Questa è generalmente una definizione macro in fase di compilazione.

A meno che non mi sbaglio, STLPort offre questo con _STLP_USE_EXCEPTIONS = 0 e _STLP_NO_EXCEPTIONS. Non so come si comportano i programmi con queste impostazioni. ;)

Penso che ci sia qualche bandiera nascosta nel MS STL pure.

L'EASTL esce dalla scatola con le eccezioni disabilitata:

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

10

Microsoft STL supporta eccezione disattivazione.

Per la macro di definizione di MSVC STL _HAS_EXCEPTIONS = 0 disabilita le eccezioni nel caso in cui si colleghi l'applicazione con libcmt.lib/libcmtd.lib (opzione/MT o/MTd del compilatore).

Se si collega msvcrt.lib/msvcrtd.lib (/ MD o/opzione del compilatore MDD) è necessario definire un'altra macro - _STATIC_CPPLIB. In tal caso, aggiungere le seguenti righe prima di includere qualsiasi codice STL:

#define _HAS_EXCEPTIONS 0 
#define _STATIC_CPPLIB 

o aggiungere quanto segue alle opzioni del compilatore:

-D_HAS_EXCEPTIONS=0 -D_STATIC_CPPLIB 

prega di notare che è necessario disabilitare le eccezioni C++ nelle impostazioni di progetto.

+0

Quello che non capisco è quando si utilizza/MD o/MDd perché è necessario il _STATIC_CPPLIB. Da quanto ho potuto leggere, il codice utilizza libcmt.lib e non msvcrtd.lib. L'intero punto di utilizzo di/MD è di avere librerie collegate dinamicamente e non librerie statiche collegate. L'aggiunta di _STATIC_CPPLIB sembra vanificare lo scopo dell'uso del flag/MD. – gnash117

+0

_STATIC_CPPLIB è obsoleto in MSVC 2010 quindi utilizzarlo con MSVC 2010 sostituirà semplicemente un set di avvisi con un altro. – gnash117

+0

gnash117, MSDN per MSVC2008 dice che quando si utilizza la definizione del preprocessore _STATIC_CPPLIB l'applicazione collega libcmt.lib invece di msvcprt.lib, ma continua a collegarsi dinamicamente al CRT principale tramite msvcrt.lib. – Rom098