2011-12-08 19 views
7

मेरे पास निम्न टेम्पलेट फ़ंक्शन का उपयोग किसी मानक प्रकार के डेटा को बाइनरी आउटपुट स्ट्रीम में डंप करने के लिए किया जाता है।सी-स्टाइल कास्ट बनाम reinterpret_cast

template<typename T> static void 
dump (const T& v, ostream& o) { 
    o.write (reinterpret_cast<const char*>(&v), sizeof(T)); 
} 

reinterpret_cast के बजाय मैं सी-शैली (कॉन्स char *) का भी उपयोग कर सकता हूं। क्या reinterpret_cast का उपयोग करने के लिए कोई विशेष कारण है? मैंने कुछ अन्य पोस्ट पढ़ीं जहां reinterpret_cast पर फंसे हुए थे। लेकिन उपर्युक्त उपयोग कानूनी है और इसे किसी और चीज़ से बदला नहीं जा सकता है, है ना?

धन्यवाद

+0

मुझे लगता है कि आप ऐसा करने के परिणाम जानते हैं (जिसके परिणामस्वरूप फ़ाइल को उसी आर्किटेक्चर पर एक ही संकलक के साथ उसी विकल्प के साथ संकलित प्रोग्राम द्वारा पढ़ा जा सकता है)। – curiousguy

+0

कोई मुझे यह कहने के लिए पंच करने जा रहा है, लेकिन यदि आप * सी * शैली का उपयोग करना चाहते हैं, तो आप हमेशा एक सामान्य-कट्टरपंथी टिप्पणी छोड़ सकते हैं जिसे आप याद नहीं कर सकते। आपके 'कॉन्स' को सी में भी ढूंढने के लिए * कुछ * तरीका था। ¯ | _ (ツ) _ | ¯ बेशक आपको खतरों को ध्यान में रखना चाहिए, हालांकि। –

उत्तर

10

सी शैली डाले के साथ समस्या यह है कि वे हुड के नीचे एक बहुत कुछ कर सकता है। विस्तृत विवरण के लिए यहां देखें: http://anteru.net/2007/12/18/200/

आपको हमेशा सी ++ - कास्ट्स का उपयोग करने की कोशिश करनी चाहिए, लंबे समय तक जीवन को आसान बनाता है। इस मामले में सी-शैली के साथ मुख्य समस्या यह है कि आप (char*)(&v) लिख सकते थे जबकि reinterpret_cast के साथ, आपको अतिरिक्त const_cast की आवश्यकता होगी, इसलिए यह थोड़ा सुरक्षित है। इसके अलावा आप आसानी से reinterpret_cast को रेगेक्स के साथ पा सकते हैं, जो सी-स्टाइल के लिए संभव नहीं है।

+2

आपको 'reinterpret_cast' के लिए एक पूर्ण उग्र रेगेक्स की भी आवश्यकता नहीं है, एक साधारण पाठ खोज (अधिकांश संपादकों पर अच्छा ओल' 'ढूंढें ") पर्याप्त है :) –

+3

Args, हाँ। मैंने शुरू किया कि आप सी-स्टाइल कास्ट के लिए रेगेक्स नहीं कर सकते हैं, और फिर सजा दूसरी तरफ घायल हो जाती है;) – Anteru

+0

सभी जानवरों को ढूंढना चाहेंगे? – curiousguy

1

reinterpret_cast जब यह बदलने के लिए प्रयोग किया जाता है पर सिकोड़ी है एक static_cast या dynamic_cast। एक सी कास्ट बदलने के लिए इसका उपयोग प्रोत्साहित किया जाता है।

नए जानवरों को सी-स्टाइल कास्ट पर लाभ होता है। एक के लिए, आप सीमित कर सकते हैं कि आप वास्तव में क्या चाहते हैं, दूसरे के लिए सी सी के मुकाबले नए जानवरों के लिए पाठ्यचर्या खोज करना कहीं अधिक आसान है।

+1

"नए casts_ के लिए एक पाठ खोज" _ आपने कितनी बार ऐसा किया है? – curiousguy

+0

@curiousguy: मैंने इसे कुछ बार किया है। मुझे शायद ही कभी परवाह है कि मुझे एक कलाकार से कुछ मिला है, लेकिन मुझे अक्सर परवाह है कि मैंने एक विशेष कदम उठाया है जिसे मुझे पता है कि एक कास्ट ऑपरेशन शामिल है। मैं कास्ट की तलाश नहीं कर रहा हूं, * प्रति * *, मैं कुछ और ढूंढ रहा हूं जिसे मुझे पता चला कि एक कास्ट इस्तेमाल किया जाता है। –

4

कोई फर्क नहीं पड़ता। दी गई स्थिति में, सी-स्टाइल कास्ट ठीक से "पुन: व्याख्या" -कास्ट है।

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

+0

"_ नोट करें कि एकमात्र वैध पुन: व्याख्या-कास्ट आमतौर पर शून्य के लिए होते हैं-() pointer_" आप 'शून्य * क्यों डालना चाहते हैं? – curiousguy

+0

@curiousguy: प्लेसमेंट-नया ... –

+0

आपको यहां 'reinterpret_cast' की आवश्यकता नहीं है; 'static_cast' ठीक है। (मुझे मानक 'implicit_cast' पसंद आया होगा।) – curiousguy

3

सी शैली कास्टिंग बहुत खतरनाक है। इसलिए सी ++ ने विशिष्ट उपयोग के आधार पर नीचे दिए गए प्रकारों को कास्टिंग किया,

गतिशील_कास्ट (अभिव्यक्ति) - उचित वर्ग पदानुक्रम के बीच कास्टिंग की अनुमति देता है।

const_cast (अभिव्यक्ति) - दूरसंचार को दूर करता है।

static_cast (अभिव्यक्ति) - एक हद तक सी शैली के लिए लेकिन अभी भी प्रकारों के बीच कुछ असंगतताओं का सम्मान करता है और अनुमति नहीं देता है।

reinterpret_cast (अभिव्यक्ति) - यदि अभी भी आवश्यकता पूरी नहीं हुई है, तो यह उपलब्ध है। सी शैली कास्टिंग लेकिन एक नाम के साथ। इसलिए इसे बड़े कोड बेस में ढूंढना आसान होगा।

नोट: - अधिकांश "reinterpret_cast" उचित डिजाइन के साथ समाप्त किया जा सकता है। दूसरे शब्दों में "reinterpret_cast" की आवश्यकता है, सबसे अधिक संभावना है कि डिजाइन में कुछ गलत है।

अद्यतन: यह अंतिम विकल्प होना चाहिए, और उपर्युक्त मामले में, उपयोग सही है। अब reinterpret_cast का उल्लेख पाठक को यह धारणा देगा कि जानबूझकर लेखक ने प्रकार की सुरक्षा की देखभाल नहीं की है। लेकिन सी स्टाइल कास्टिंग का उपयोग उस इंप्रेशन को नहीं देगा।

+0

लेकिन मुझे लगता है कि ऊपर दिए गए कोड में इस्तेमाल किया गया reinterpret_cast बहुत सरल है - और आपके रीडिज़ाइन नोट के लिए योग्य नहीं है? – shekhar

+0

जैसा कि मैंने उल्लेख किया है, यह अंतिम विकल्प होना चाहिए, और उपर्युक्त मामले में, उपयोग सही है। अब reinterpret_cast का उल्लेख पाठक को यह धारणा देगा कि जानबूझकर लेखक ने प्रकार की सुरक्षा की देखभाल नहीं की है। लेकिन सी स्टाइल कास्टिंग का उपयोग उस इंप्रेशन को नहीं देगा। – rakesh

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