2012-03-04 9 views
6

मैं होस्टेड mbed C++ compiler का उपयोग करके अपने एमबीड में एक सी ++ लाइब्रेरी पोर्ट कर रहा हूं जो मूल रूप से एआरएमसीसी कॉन्फ़िगरेशन के साथ है जिसे आप वास्तव में नहीं बदल सकते हैं। कॉन्फ़िगरेशन विकल्पों में से एक जिस पर उन्होंने निर्णय लिया (कुछ अज्ञात कारणों से) यह है कि अपवाद समर्थित नहीं हैं। तो throw और catch संकलक त्रुटियों को उत्पन्न करेगा।एक सी ++ कंपाइलर के साथ काम करना जो अपवादों का समर्थन नहीं करता है?

अपवादों के बिना आप मानक सी ++ लाइब्रेरी का उपयोग कैसे कर सकते हैं? मैं अपनी पुस्तकालय में कुछ वैक्टर का उपयोग करता हूं। मुझे कैसे पता चलेगा कि push_back फ़ंक्शन वास्तव में सफल हुआ है या नहीं? क्या यह जानने का कोई मानक तरीका है कि कोई अपवाद हुआ या क्या यह exit(1) या कुछ करता है?

+0

http://stackoverflow.com/questions/3870435/handling-stl-errors-without-exceptions के संभावित डुप्लिकेट – Philipp

उत्तर

2

वे स्पष्टीकरण दें कि यह here समर्थित नहीं है:

पारंपरिक ज्ञान (और armcc संकलक लोगों से सलाह) कि अपवादों की भूमि के ऊपर बहुत उच्च इस तरह के लिए उपयुक्त नहीं है और इसलिए है डोमेन। अभी के लिए, इसलिए हम सहायक अपवाद नहीं हैं (समर्थन को हटाना मुश्किल है, लेकिन इसे जोड़ने में आसान है)।

हम निश्चित रूप से वास्तव में (mbed वास्तव में पारंपरिक नहीं है, तो शायद अपवाद एकदम सही हैं!) कुछ बिंदु पर ओवरहेड्स स्थान और समय को समझने पर ही गौर करेंगे, लेकिन अब आप अधिक से चिपके करना होगा पारंपरिक अपवाद हैंडलिंग दृष्टिकोण।

और here:

हम संकलक में अपवाद हैंडलिंग का समर्थन नहीं करते हैं, और यह इसे जोड़ने के लिए नहीं की योजना बनाई है। लेकिन मुझे यह सुनकर खुशी होगी कि आप आमतौर पर को अपने माइक्रोक्रोनरोलर एप्लिकेशन या अपने अनुभवों में कैसे उपयोग करते हैं! लेकिन अब के लिए , आपको अधिक मानक सी समाधानों को चालू करना होगा।

मुझे लगता है कि कर सकते हैं असाधारण स्थितियों std::terminate() में समाप्त होता है पर this आधार पर।

मुझे नहीं लगता कि अपवादों का समर्थन नहीं करना भाषा मानक प्रति सी ++ में एक कानूनी विकल्प है। इसलिए, आपको या तो यह देखने के लिए प्रयोग करना चाहिए कि new या push_back() संकलक के पीछे लोगों को विफल या पूछने पर क्या होता है।

3

अपवादों के बिना आप मानक सी ++ लाइब्रेरी का उपयोग कैसे कर सकते हैं? मैं मेरी लाइब्रेरी में कुछ वैक्टर का उपयोग करता हूं। मुझे कैसे पता चलेगा कि push_back फ़ंक्शन वास्तव में सफल हुआ है या नहीं? क्या एक अपवाद हुआ है या यह सिर्फ बाहर निकलने (1) या कुछ करने के बारे में जानने का कोई मानक तरीका है?

सी ++ में अपवाद हैंडलिंग अक्षम करने के बाद आप बहुत ही प्रतिबंधित क्षेत्र में जा रहे हैं।

कुछ मानक लाइब्रेरी कार्यान्वयन, जैसे कि डंकमवेयर, एक अपवाद अक्षम करने की अनुमति देता है। वहां मैक्रो, _HAS_EXCEPTIONS को 0 के रूप में परिभाषित करने का मामला है। एसटीएलपोर्ट के पास _STLP_USE_EXCEPTIONS = 0 के साथ एक समान सम्मेलन है।

हालांकि, अपवाद अक्षम होने पर मानक पुस्तकालयों को क्या करना चाहिए इसकी कोई मानक परिभाषा नहीं है। अधिकांश भाग के लिए अपवाद-हैंडलिंग, सी ++ भाषा में बहुत अधिक है। यहां तक ​​कि dynamic_cast और operator new/new[] डिफ़ॉल्ट रूप से फेंकते हैं और वे लाइब्रेरी सुविधाएं नहीं हैं।

मानक पुस्तकालय कार्यान्वयन के लिए भी क्या होना चाहिए इसकी स्पष्ट परिभाषा की कमी भी नहीं है जो फेंक नहीं देती है। यदि अनुक्रम push_back उस अनुक्रम के लिए अधिक स्मृति आवंटित करने की प्रक्रिया में फेंकता है, तो क्या होना चाहिए? क्या तत्व बस सम्मिलित नहीं है? इन अनुक्रमों के मानक इंटरफेस निश्चित रूप से हमें इस बारे में कुछ भी नहीं बताते हैं कि ऐसी त्रुटि कब होती है।

इसके अलावा, सामान्य रूप से बहुत सारे सी ++ पुस्तकालय ऐसे कार्यों का उपयोग करेंगे जो ऑपरेटर की तरह फेंकते हैं (और नोट्रो संस्करण नहीं)। नतीजतन, हम अपवाद अक्षम करने के बाद बहुत सारे अपरिभाषित व्यवहार क्षेत्र में उद्यम करते हैं।

मुझे एक बार ऐसी कंपनी में काम करना पड़ा जो अपवाद-प्रबंधन से इंकार कर रहा था क्योंकि वरिष्ठ प्रोग्रामर प्रभारी समयपूर्व अनुकूलक थे, जिन्होंने सी को पसंद किया और सोचा कि सी ++ भयानक और अक्षम था (संयोग से, उन्होंने कुछ सबसे अक्षम कोड लिखा था लिंक्ड सूचियों के लिए एक डिफ़ॉल्ट कंटेनर के रूप में मजबूत वरीयता के साथ टीम जिसने हॉटिंग नॉट्स को सब कुछ के लिए आवंटित/हटाए जाने वाले छोटे नोड्स की भारी संख्या के कारण बाएं और दाएं दिखने के लिए प्रेरित किया है, लेकिन यह एक और कहानी है)।

एम्बेडेड सिस्टम के साथ, अपवाद हैंडलिंग के खिलाफ तर्क थोड़ा मजबूत हो सकता है, लेकिन सामान्य रूप से सी ++ पर भरोसा करना मुश्किल हो जाता है। मुझे लगता है कि अपवाद-हैंडलिंग के बिना आप जो भी कर सकते हैं, वह सी ++ के एक अपरिपक्व रूप को मानक पुस्तकालय भागों के बिना स्वीकार नहीं करता है, जब तक कि आप अपने विशेष मानक लाइब्रेरी विक्रेता को विशिष्ट कामकाज और चाल खोजने की कोशिश करने में बहुत समय व्यतीत नहीं करना चाहते जो इसके लायक से ज्यादा परेशानी हो सकती है।

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

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