कार्यान्वयन-परिभाषित व्यवहार और अपरिभाषित व्यवहार
C ++ मानक विभिन्न निर्माणों के प्रभावों के बारे में बहुत विशिष्ट है, और विशेष रूप से आपको हमेशा इन श्रेणियों की परेशानी के बारे में पता होना चाहिए :
अपरिभाषित व्यवहार का मतलब है कि कोई गारंटी नहीं दी गई है। कोड काम कर सकता है, या यह आपके हार्डड्राइव में आग लगा सकता है या राक्षसों को आपकी नाक से बाहर निकाल सकता है । जहां तक C ++ लैंग्वेज की बात है, तो कुछ भी हो सकता है। व्यावहारिक रूप से, इसका आमतौर पर मतलब है कि आपके पास एक अपरिवर्तनीय बग है। यदि ऐसा होता है, तो आप वास्तव में अपने एप्लिकेशन के बारे में कुछ भी भरोसा नहीं कर सकते हैं (क्योंकि इस अपरिभाषित व्यवहार के प्रभावों में से एक सिर्फ आपके ऐप के बाकी हिस्सों द्वारा उपयोग की गई मेमोरी को गड़बड़ाना हो सकता है)। यह सुसंगत होना आवश्यक नहीं है, इसलिए प्रोग्राम को दो बार चलाने से अलग परिणाम मिल सकते हैं। यह चंद्रमा के चरणों पर निर्भर हो सकता है, शर्ट का रंग जो आप पहन रहे हैं, या बिल्कुल कुछ और।
अनिर्दिष्ट व्यवहार का मतलब है कि कार्यक्रम को कुछ समझदार और सुसंगत करना चाहिए, लेकिन इसे दस्तावेज़ करने की आवश्यकता नहीं है ।
कार्यान्वयन-परिभाषित व्यवहार अनिर्दिष्ट के समान है, लेकिन संकलक लेखकों द्वारा भी प्रलेखित किया जाना चाहिए। इसका एक उदाहरण है reinterpret_cast
। आमतौर पर , यह पते को संशोधित किए बिना, केवल एक पॉइंटर के प्रकार को बदलता है, लेकिन मैपिंग वास्तव में कार्यान्वयन-परिभाषित है, इसलिए एक कंपाइलर पूरी तरह से अलग पते पर मैप कर सकता है , जब तक कि यह इस विकल्प को दस्तावेजित करता है। एक और उदाहरण एक इंट का आकार है। C ++ मानक की परवाह नहीं है अगर यह 2, 4 या 8 बाइट्स है, लेकिन इसे कंपाइलर द्वारा प्रलेखित किया जाना चाहिए
लेकिन इन सभी के लिए आम बात यह है कि वे सबसे अधिक परहेज करते हैं। जब संभव हो, तो ऐसे व्यवहार के साथ रहें जो C ++ मानक द्वारा निर्दिष्ट 100% है। इस तरह, आप पोर्टेबिलिटी की गारंटी दे रहे हैं।
आपको अक्सर कुछ कार्यान्वयन-परिभाषित व्यवहार पर भी भरोसा करना होगा। यह अपरिहार्य हो सकता है, लेकिन आपको अभी भी इस पर ध्यान देना चाहिए, और ध्यान रखें कि आप किसी ऐसी चीज़ पर भरोसा कर रहे हैं जो विभिन्न कंपाइलरों के बीच बदल सकती है।
दूसरी ओर, अपरिभाषित व्यवहार को हमेशा टाला जाना चाहिए। सामान्य तौर पर, आपको बस यह मान लेना चाहिए कि यह आपके प्रोग्राम को एक या दूसरे तरीके से विस्फोट कर देता है।