2011-01-20 9 views
5

सी ++ डर के बिना में: एक प्रारंभिक मार्गदर्शिका बनाता है जो आपको लगता स्मार्ट पुस्तक, और अध्याय में (8), यह उल्लेख है निम्नलिखित के बारे में reinterpret_castreinterpret_cast

.... एक सूचक प्रकार से धर्मान्तरित (int) दूसरे (char *) में। चूंकि कास्ट की ओर इशारा करते हुए डेटा का अर्थ बदलता है, इसे static_cast के विपरीत, reinterpret_cast कहा जाता है। *

क्या आप यहां इस अनुच्छेद का वर्णन कर सकते हैं? ऑपरेशन के नाम के तरीके के लिए विशेष रूप से कारण?

धन्यवाद।

+3

यह एक किताब के लिए एक महान नाम है! – Joe

+0

आज एक और सवाल था जो इस पुस्तक से बाहर आया, और यह कुछ भी करने के लिए समाप्त हो गया लेकिन ओपी को स्मार्ट लग रहा था। –

+0

आह, हाँ, यह आप थे। http://stackoverflow.com/questions/4746980/c-quitting-a-program शर्म आपने एक असली प्राप्त करने के बारे में मेरी सलाह न लेने का विकल्प चुना। –

उत्तर

6

असल में, reinterpret_cast एक विशिष्ट स्थान पर एक अलग प्रकार के रूप में बिट पैटर्न को पुन: परिभाषित करता है।

उदाहरण यहाँ देखें: "। Reinterpret_cast ऑपरेटर अपने तर्क के रूप में एक ही सा पैटर्न है कि एक नए प्रकार के एक मूल्य पैदा करता है" http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage%2Fref%2Fclrc05keyword_reinterpret_cast.htm

स्थैतिक कलाकार इसे फिर से परिभाषित करने के बजाय तर्क को परिवर्तित करता है। आप static_casting और int को फ़्लोट करने और int को फ़्लोट करने के लिए reinterpret_casting करके इसे आज़मा सकते हैं। परिणाम पूरी तरह से अलग होगा।

+3

यह आवश्यक रूप से एक ही बिट पैटर्न नहीं है। मानक में 'reinterpret_cast' पर बहुत कम गारंटी है। 5.2.10/3 कहता है "' reinterpret_cast' द्वारा निष्पादित मैपिंग कार्यान्वयन-परिभाषित है। [नोट: यह मूल मान से अलग प्रतिनिधित्व प्रस्तुत कर सकता है या नहीं।] "इसके अलावा, एक 'reinterpret_cast'' int 'को' फ्लोट '(यह 'int *' को 'float *' पर डाला जा सकता है)। कोई भी कार्यान्वयन जो उस कलाकार को मानक (5.2.10/1, अंतिम वाक्य) का उल्लंघन कर रहा है, हालांकि यह शायद एक आम पर्याप्त विस्तार है। –

4

यहाँ फैंसी कुछ भी नहीं है। यह वास्तव में कुछ चीजों को दोबारा परिभाषित करने का इरादा है।

मानक 5.3.10 से, reinterpret_cast निम्नलिखित मामलों को पूरा करने के उद्देश्य से है:

  • एक संकेतक स्पष्ट रूप से किसी भी अभिन्न प्रकार काफी बड़ी इसे पकड़ करने के लिए परिवर्तित किया जा सकता है।
  • अभिन्न प्रकार या गणना प्रकार का एक मूल्य स्पष्ट रूप से एक सूचक में परिवर्तित किया जा सकता है।
  • किसी फ़ंक्शन के लिए पॉइंटर को एक अलग प्रकार के फ़ंक्शन में स्पष्ट रूप से एक पॉइंटर में परिवर्तित किया जा सकता है।
  • किसी ऑब्जेक्ट के लिए पॉइंटर को एक पॉइंटर में एक अलग ऑब्जेक्ट प्रकार में स्पष्ट रूप से रूपांतरित किया जा सकता है।
  • एक पॉइंटर को किसी ऑब्जेक्ट प्रकार या इसके विपरीत किसी सूचक में कनवर्ट करना सशर्त रूप से समर्थित है।
  • शून्य सूचक मूल्य (4.10) गंतव्य प्रकार के शून्य सूचक मूल्य में परिवर्तित किया गया है।
  • "एक्स प्रकार टी 1 के सदस्य के लिए सूचक" के प्रकार का एक स्पष्ट रूप से टी 1 और टी 2 दोनों कार्य प्रकार या दोनों ऑब्जेक्ट प्रकार हैं, तो टी प्रकार और टी 2 के प्रकार के सूचक के लिए एक अलग प्रकार के सूचक के रूप में स्पष्ट रूप से परिवर्तित किया जा सकता है। ।
  • टाइप टी 1 की एक अंतराल अभिव्यक्ति को "टी 2 के संदर्भ" प्रकार में डाला जा सकता है, यदि "पॉइंटर टू टी 1" की अभिव्यक्ति को एक reinterpret_cast का उपयोग करके स्पष्ट रूप से "पॉइंटर टू टी 2" में परिवर्तित किया जा सकता है। यही कारण है, एक संदर्भ डाली reinterpret_cast < टी &> (एक्स) (बिल्ट-इन & और * ऑपरेटरों के साथ रूपांतरण * reinterpret_cast < टी *> (& एक्स) जैसा ही होता है और इसी तरह reinterpret_cast < के लिए T & &> (एक्स))।
+0

आपने गलती की - यह पैराग्राफ 5.2.10 मानक में है (आपने 5.3.10 लिखा है) –

+0

क्या संशोधन को संशोधन से संशोधन में बदलने की अनुमति नहीं है, बीटीडब्ल्यू? :) – Kos

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