2009-02-16 16 views
18

मैं एमएसवीसी के तहत संकलित मेरे सी ++ अनुप्रयोग में अपवादों को अक्षम करना चाहता हूं। मैंने विकल्प को C++ अपवादों को सक्षम करने के लिए स्विच किया है, लेकिन मुझे चेतावनियां मिलती हैं जो मुझे विकल्प/एएचएससी का उपयोग करने के लिए कहती हैं, जिसे मैं नहीं चाहता हूं।क्या मैं एसटीएल में अपवाद अक्षम कर सकता हूं?


मेरे पास मेरे कोड में ब्लॉक/प्रयास ब्लॉक नहीं है, लेकिन मैं एसटीएल का उपयोग करता हूं। मैं ने पाया है कि मैक्रो परिभाषा _HAS_EXCEPTIONS का उपयोग कर = 0 एसटीएल में अपवाद को अक्षम करना चाहिए, लेकिन मैं अभी भी तरह की चेतावनी हो रही है:


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'


वहाँ किसी भी तरह से कैसे दूर अपवाद स्विच करने के लिए है एसटीएल है?

नोट: मेरे कोड में मैं आरटीटीआई विकल्पों को भी बंद करना चाहता हूं। मुझे वही चेतावनी मिलती है चाहे आरटीटीआई चालू या बंद हो।

उत्तर

5

टाइप आईडी रन-टाइम प्रकार पहचान के साथ करना है। आप आरटीटीआई को बंद करने की भी कोशिश कर सकते हैं।

हालांकि, सी ++ मानक पुस्तकालय के कुछ हिस्सों को अपवाद फेंकने के लिए निर्दिष्ट किया गया है। यदि आप उन्हें अक्षम करते हैं तो आप "अपरिभाषित व्यवहार" के धुंधले पानी में नौकायन कर रहे हैं।

7

आपको एक एसटीएल का उपयोग करने की आवश्यकता है जो अपवाद निष्क्रियता का समर्थन करता है। यह आम तौर पर संकलन-समय मैक्रो परिभाषा है।

जब तक मैं गलत कर रहा हूँ, STLport _STLP_USE_EXCEPTIONS = 0 और _STLP_NO_EXCEPTIONS के साथ इस प्रदान करता है। मुझे नहीं पता कि कार्यक्रम इन सेटिंग्स के साथ कैसे व्यवहार करते हैं। ;)

मुझे लगता है कि एमएस एसटीएल में कुछ छिपे हुए झंडे भी हैं।

EASTL अक्षम अपवादों के साथ बॉक्स से बाहर आता है:

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

10

माइक्रोसॉफ्ट एसटीएल अपवाद छोड़ना समर्थन करता है।

MSVC एसटीएल के लिए परिभाषित करने मैक्रो _HAS_EXCEPTIONS = 0 मामले में अपवाद को निष्क्रिय आप libcmt.lib/libcmtd.lib (/ मीट्रिक टन या/MTD संकलक विकल्प) के साथ अपने आवेदन लिंक।

यदि आप msvcrt.lib/msvcrtd.lib (/ MD या/MDd कंपाइलर विकल्प) से लिंक करते हैं तो आपको एक और मैक्रो - _STATIC_CPPLIB को परिभाषित करने की आवश्यकता है। इस मामले में या तो किसी भी एसटीएल कोड शामिल करने से पहले निम्न पंक्तियां जोड़ें:

#define _HAS_EXCEPTIONS 0 
#define _STATIC_CPPLIB 

या संकलक विकल्प के लिए निम्नलिखित जोड़ें:

-D_HAS_EXCEPTIONS=0 -D_STATIC_CPPLIB 

कृपया ध्यान दें कि आप अपने प्रोजेक्ट सेटिंग्स में सी ++ अपवाद को निष्क्रिय करने की जरूरत है।

+0

जो मुझे समझ में नहीं आता है वह है जब/एमडी या/एमडीडी का उपयोग करते समय हमें _STATIC_CPPLIB क्यों चाहिए। जो मैंने पढ़ा है, उससे यह कोड libcmt.lib का उपयोग करने का कारण बनता है और msvcrtd.lib नहीं।/एमडी का उपयोग करने का पूरा बिंदु गतिशील रूप से जुड़े पुस्तकालयों और स्थिर लिंक्ड पुस्तकालयों के लिए है। _STATIC_CPPLIB जोड़ना/एमडी ध्वज का उपयोग करने के उद्देश्य को हराने के लिए लगता है। – gnash117

+0

_STATIC_CPPLIB को एमएसवीसी 2010 में बहिष्कृत किया गया है, इसलिए एमएसवीसी 2010 के साथ इसका उपयोग केवल चेतावनियों के एक सेट को दूसरे के साथ बदल देगा। – gnash117

+0

gnash117, MSVC2008 के लिए एमएसडीएन का कहना है कि _STATIC_CPPLIB प्रीप्रोसेसर परिभाषा का उपयोग करते समय आपका एप्लिकेशन msvcprt.lib के बजाय libcmt.lib को लिंक करता है, लेकिन फिर भी msvcrt.lib के माध्यम से मुख्य सीआरटी को गतिशील रूप से लिंक करता है। – Rom098

संबंधित मुद्दे