2009-02-16 26 views
18

MSVC kapsamında derlenen C++ uygulamasındaki istisnaları devre dışı bırakmak istiyorum. Enable C++ istisnalarını Hayır olarak değiştirdim, ancak istemediğim seçeneği/Ehsc'i kullanmamı söyleyen uyarıları alıyorum.STL'deki istisnaları devre dışı bırakabilir miyim?


Kodumda try/catch blokları yok, ancak STL kullanıyorum. istisnalar kapatmak için nasıl bir yolu var mı


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'


: Ben makro tanımı _HAS_EXCEPTIONS kullanarak = 0 STL istisnalar devre dışı gerektiğini bulduk, ama hala gibi uyarı alıyorum STL nedir?

Not: Kodumda da RTTI seçeneklerini kapatmak istiyorum. RTTI açık veya kapalı olursa olsun aynı uyarıları alırım.

cevap

5

Tür kimliği çalışma zamanı türü tanımlama ile ilgilidir. RTTI'yi de kapatmayı deneyebilirsiniz. Ancak, C++ Standart Kitaplığı'nın belirli bölümleri, özel durumlar oluşturmak için belirtilmiştir. Onları devre dışı bırakırsanız, “tanımlanmamış davranışların” berbat sularına yelken açarsınız.

7

İstisna devre dışı bırakmayı destekleyen bir STL kullanmanız gerekir. Bu genellikle derleme zamanı makro tanımlamasıdır.

Yanılmıyorsam, STLPort bunu _STLP_USE_EXCEPTIONS = 0 ve _STLP_NO_EXCEPTIONS ile sunuyor. Programların bu ayarlarla nasıl davrandığını bilmiyorum. ;) MS STL'de de gizli bir bayrak olduğunu düşünüyorum.

EASTL devre dışı istisnalar dışında kutu çıkıyor:

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

10

Microsoft STL istisna deaktivasyon destekler.

MSVC STL tanımlama makrosu için _HAS_EXCEPTIONS = 0, uygulamanızı libcmt.lib/libcmtd.lib (/ MT veya/MTd derleyici seçeneği) ile bağlamanız durumunda istisnaları devre dışı bırakır.

msvcrt.lib/msvcrtd.lib (/ MD veya/MDd derleyici seçeneği) ile bağlantı kurarsanız, bir tane daha makro tanımlamanız gerekir - _STATIC_CPPLIB.

#define _HAS_EXCEPTIONS 0 
#define _STATIC_CPPLIB 

veya derleyici seçenekleri aşağıdakileri ekleyin: Bu durumda herhangi bir STL kodu eklemeden önce aşağıdaki satırları ekleyin ya

-D_HAS_EXCEPTIONS=0 -D_STATIC_CPPLIB 

Eğer proje ayarlarında C++ özel durumları devre dışı bırakmak gerektiğini unutmayın.

+0

Neyi anlamadığım/MD veya MDd kullanırken _STATIC_CPPLIB neden ihtiyacımız var. Okuduklarımdan kodun libcmt.lib kullanılmasına ve msvcrtd.lib kullanılmasına neden olur./MD'yi kullanmanın tüm noktası, dinamik olarak bağlantılı kitaplıklara sahip olmak ve statik bağlantılı kitaplıklara sahip olmamaktır. _STATIC_CPPLIB eklemek,/MD bayrağını kullanma amacını ortadan kaldırıyor gibi görünüyor. – gnash117

+0

_STATIC_CPPLIB, MSVC 2010'da kullanımdan kaldırılmıştır, bu yüzden MSVC 2010 ile kullanmak bir uyarı setini diğeriyle değiştirecektir. – gnash117

+0

gnash117, MSVC2008 için MSDN, _STATIC_CPPLIB önişlemcisi tanımını kullanırken, uygulamanızın msvcprt.lib yerine libcmt.lib dosyasını bağladığını ancak msvcrt.lib aracılığıyla dinamik olarak ana CRT'ye bağlandığını söylüyor. – Rom098

İlgili konular