c स्टाइल कास्ट्स या c ++ स्टाइल कास्ट्स


21

तो, आप क्या उपयोग करते हैं?

int anInt = (int)aFloat;

या

int anInt = static_cast<int>(aFloat);
// and its brethren

और, अधिक महत्वपूर्ण बात, क्यों?

जवाबों:


45

पहले, यह समझें कि वे रेखाएँ समतुल्य नहीं हैं

int* anInt = (int*)aFloat; // is equivalent to

int* anInt = reinterpret_cast<int*>(aFloat); 

यहाँ क्या हो रहा है कि प्रोग्रामर कंपाइलर को यह करने के लिए कह रहा है कि वह जो भी कर सकता है उसे कास्ट करे।

यह अंतर महत्वपूर्ण है क्योंकि static_cast का उपयोग केवल आधार प्रकार के लिए पूछेगा जो कि "सुरक्षित" रूपांतरित करने के लिए होता है, जहाँ reinterpret_cast किसी भी चीज़ में परिवर्तित हो जाएगा, संभवतः दिए गए ऑब्जेक्ट की मेमोरी पर वांछित मेमोरी लेआउट को मैप करके।

तो, जैसा कि "फ़िल्टर" समान नहीं है, सी कास्ट का उपयोग करने की तुलना में विशिष्ट कास्ट का उपयोग करना अधिक स्पष्ट और सुरक्षित है, यदि आप कंपाइलर पर भरोसा करते हैं (या रनटाइम इम्प्लांट। यदि आप डायनेमिक_कास्ट का उपयोग करते हैं) तो आपको यह बताने के लिए कि आपने कुछ गलत कहाँ किया है। , सी कास्ट और reinterepret_cast से बचें।

अब जब यह अधिक स्पष्ट है, तो एक और बात है: static_cast, reinterpret_cast, const_cast और dynam_cast को खोजना आसान है

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

वह "डिज़ाइन द्वारा" है। और यह डेवलपर को यह जानने की अनुमति देता है कि वह कहां से चीजों को बेहतर तरीके से कर सकता है (पूरी तरह से जाति से बचने के लिए, अगर वास्तव में जरूरत नहीं है) और जहां यह ठीक है लेकिन यह कोड में "दस्तावेज" है इसे "बदसूरत" के रूप में चिह्नित करें।

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

हो सकता है, क्योंकि static_cast इतनी बदसूरत और इतनी अपेक्षाकृत टाइप करने के लिए कठिन है, आप एक का उपयोग करने से पहले दो बार सोचने की संभावना है? यह अच्छा होगा, क्योंकि आधुनिक C ++ में कलाकार वास्तव में परहेज करते हैं।

स्रोत: बज़्ने स्ट्रॉस्ट्रुप (C ++ निर्माता)


2
अगर मैं कुछ और अंक रखता, तो मैं इसे कम कर देता, लेकिन दुर्भाग्य से मैं नहीं कर सकता। c- शैली की कास्ट्स reinterpret_cast के बराबर नहीं हैं। विचार करें reinterpret_cast<int>(double);। एक सी-स्टाइल कास्ट के साथ एक इंट का डबल कास्ट करना पूरी तरह से संभव है, लेकिन इसे reinterpret_cast के साथ करना संभव नहीं है। मैं देखता हूं कि टिम्बो ने पहले ही आपको यह इंगित कर दिया था, और आपने कहा था कि आप इसे ठीक कर देंगे, लेकिन चार साल बाद भी यह गलत है। मैं अभी भी आपको नीचा दिखाऊंगा अगर यह तय किया गया था, क्योंकि कास्ट का उपयोग करने के लिए पूरी तरह से वैध कारण हैं। यहाँ एक बेहतर जवाब है: stackoverflow.com/a/332086/3878168
Yay295

36

C ++ जातियां अधिक प्रतिबंधात्मक हैं (इसलिए अपने इरादे को बेहतर तरीके से व्यक्त करें और कोड समीक्षा को आसान बनाएं, आदि)। यदि आपको कभी भी आवश्यकता हो, तो उन्हें खोजना बहुत आसान है।


10
... और वे अधिक करने की संभावना रखते हैं जो आप करना चाहते हैं। ;-)
मैके

7
और वे टाइप करने के लिए बहुत अधिक हैं, आपको एक और कारण देने की आवश्यकता के बिना सिर्फ अपने प्रकार को सही करने के लिए।
माइकल कोहेन

7
और वे एक सुविधा के रूप में बदसूरत हैं, जिससे यह स्पष्ट होता है कि कोड में सुधार के बिंदु हो सकते हैं या विशेष मामलों में जिन्हें प्रलेखन की आवश्यकता हो सकती है। - संपादित करें: वाह मुझे पता चला मैं भी इस सवाल का जवाब दिया! XD
भेजें

अब मैं उनकी तलाश क्यों करना चाहूंगा?
Deduplicator

@Deduplicator कई कारण हैं जिनसे आप जानना चाहते हैं कि कोड-बेस में कहां जा रहे हैं। उदाहरण के लिए जब शिकार कीड़े जो कास्टिंग के साथ जुड़े हो सकते हैं (विशेष रूप से क्रॉस-प्लेटफॉर्म विकास करते समय)।
Klaim

13

विकल्प सी: एक "सी ++ - स्टाइल" कास्ट, क्योंकि यह एक निर्माण से अप्रभेद्य है:

int anInt = int(aFloat);

या और भी:

int anInt(aFloat);

इसके अलावा, आदिम के साथ इन तुच्छ मामलों के अलावा, जिन्हें अच्छी तरह से समझा जाता है, मैं सी-शैली की जातियों पर x_cast <> का उपयोग करना पसंद करता हूं। तीन कारण हैं:

  • वे उस ऑपरेशन को अधिक संकीर्ण रूप से परिभाषित करते हैं जो प्रोग्रामर प्रदर्शन करने की कोशिश कर रहा था।

  • वे ऐसी क्रियाएं कर सकते हैं जो C- शैली की जातियां नहीं कर सकती (विशेष रूप से डायनेमिक_कास्ट <>, जो कई-वंशीय श्रृंखला की शाखाओं को पार कर सकती हैं)।

  • वे बदसूरत हैं । वे जोर से घोषणा करते हैं कि प्रोग्रामर टाइप सिस्टम के खिलाफ काम कर रहा है। इस मामले में, यह अच्छी बात है।


7

यदि C में कोड लिखना C जाति का उपयोग करता है। यदि C ++ में लिखना C ++ कास्ट का उपयोग करता है।

जबकि अधिकांश कास्टिंग उचित प्रकार-सुरक्षा को तोड़ती हैं, C ++ वाले अधिक प्रतिबंधक हैं, और इसलिए आप C कास्ट के साथ होने की तुलना में थोड़े कम असुरक्षित हैं।

मैं (T *) का उपयोग करके किसी को सहन कर सकता हूं, हालांकि एक अधिभार को मजबूर करने के लिए ...


7

मेरे पास C / C ++ शैली के बारे में कुछ नियम हैं:

  1. एक कास्ट को लागू करने से हमेशा एक का उपयोग करना चाहिएconst_cast । ज़ाहिर कारणों की वजह से। अफसोस की बात है कि एक कास्ट को लागू करने के बारे में मेरे नियम के कारण कीबोर्ड को पहुंचने और प्रोग्रामर की उंगली तोड़ने की मंजूरी नहीं मिली।
  2. किसी भी बिट-मैनिपुलेशन-शैली वाले शेंनिगन्स जो प्रोग्रामर को धातु के नीचे उतरने पर उठने चाहिए reinterpret_cast। यह वास्तव में कास्ट की तरह है कि सी नहीं है: इस पूर्णांक बिट का दिखावा वास्तव में फ्लोट के बिट्स हैं। इस तरह अप्रियता से बचा जाता है (int)(*(int*)(&floatVar))
  3. यदि आप शब्द लिखते हैं "dynamic_cast " , तो अपने पॉलीमॉर्फिक क्लास पदानुक्रम और डिज़ाइन को रोकें और पुनर्मूल्यांकन करें। अपनी कक्षा पदानुक्रम की डिज़ाइन का पुनर्मूल्यांकन तब तक जारी रखें जब तक आप उन शब्दों को हटा नहीं सकते।
  4. साथ परेशान मत करो static_cast

# 4 के पीछे तर्क बस इतना है कि यह कोई फर्क नहीं पड़ता। जो परिस्थितियां अन्य नियमों में फिट नहीं होती हैं वे या तो स्पष्ट हैं या वास्तव में निम्न स्तर की हैं। इंट-टू-फ्लोट जैसे सरल प्रकारों के एक सुव्यवस्थित रूपांतरण को विशेष वाक्यविन्यास की आवश्यकता नहीं होनी चाहिए। और अगर आप किसी चीज के गहरे, बदसूरत हिम्मत में नीचे हैं, ठीक है, आप किसी चीज के गहरे, बदसूरत हिम्मत में नीचे हैं। इस तथ्य पर ध्यान आकर्षित करने की कोई आवश्यकता नहीं है कि "यहां पर ड्रेगन हो," चूंकि दांत, पंजे, और आग बहुत ज्यादा पहले से ही इसे दूर कर देती है।


1
dynamic_castएक पूरी तरह से मान्य उपकरण है। शायद ही कभी, मैं मानता हूँ, लेकिन यह वैश्विक चर की तरह चीजों के शैतान से दूर है। हालाँकि, मुख्य रूप से, मैंने आपको अस्वीकार कर दिया क्योंकि आपने उस प्रश्न का उत्तर नहीं दिया था, जो सी-स्टाइल कास्ट के उपयोग या नहीं के बारे में था।
डेडएमजी

2
@ डेडएमजी: मैंने सी-स्टाइल कास्ट्स के बारे में बात की। संपूर्ण अंतिम पैराग्राफ, static_cast के पक्ष में C- शैली की कास्ट को सही ठहराता है।
निकोल बोलस

"अफसोस की बात यह है कि कीबोर्ड को पहुंचाने और प्रोग्रामर की उंगली तोड़ने के कारण एक कॉन्स्ट को लागू करने के बारे में मेरा नियम अनुमोदित नहीं हुआ।" तकनीकी रूप से यह वास्तव में संकलक के लिए कानूनी है कि ऐसा हो। जैसा कि यह संकलक के लिए कानूनी है कि आप अपनी नाक से राक्षसों को बाहर निकाल दें
फड़ाप

4

जैसा कि ऊपर दिए गए पोस्ट ध्यान दें कि C ++ (स्थिर) कास्ट व्यवहार में थोड़ा सुरक्षित है।

यह विभिन्न प्रकार के कास्टिंग और उनके समर्थक और विपक्ष के बारे में कुछ और जानकारी देखने के लिए स्मार्ट हो सकता है।

बस एक पृष्ठभूमि का अधिक क्यों है। ।

http://en.wikipedia.org/wiki/Static_cast

http://en.wikipedia.org/wiki/Dynamic_cast

http://en.wikipedia.org/wiki/Reinterpret_cast


3

यह वास्तव में निर्भर करता है कि मैं किस भाषा के साथ काम कर रहा हूं, क्योंकि आप जानते हैं कि वे क्या कहते हैं: रोम में रोमन बोलते हैं। इसलिए यदि मैं C में प्रोग्रामिंग कर रहा हूं, तो मैं अधिकतम में C सुविधाओं का उपयोग करने का प्रयास करता हूं, लेकिन यदि मैं C ++ पर प्रोग्रामिंग कर रहा हूं, तो मैं आगे बढ़ता हूं और C ++ सुविधाओं का अधिकतम उपयोग करता हूं, भले ही कुछ लोग उस दृष्टिकोण को पसंद न करें क्योंकि वे कहते हैं कि यह कोड को "कम पोर्टेबल" बनाता है, मैं कहता हूं कि मुझे परवाह नहीं है, मैं C ++ में हूं और C ++ में प्रोग्रामिंग कर रहा हूं, और मुझे कोड संकलित करने के लिए पूरी तरह से C ++ संगत संकलक की आवश्यकता है, अन्यथा मैं कुछ अलग काम करूंगा पहली जगह में।


सी में शैली डाले ;-) - यह वास्तव में सी ++ का उपयोग करने की कोशिश कर काम नहीं करता है
Steve314

3

जब टेम्पलेट में उपयोग किया जाता है, तो C शैली कलाकारों के साथ समस्याओं के कारण static_cast आदि का आविष्कार किया गया था। यदि आप एक टेम्प्लेट लिख रहे हैं, या यदि आप कोड हैं, तो बाद में एक टेम्प्लेट में परिवर्तित किया जा सकता है, तो C ++ - स्टाइल कास्ट का उपयोग करना एक अच्छा विचार है। इसका कारण यह है कि C ++ - शैली के लोग बेहतर इरादे व्यक्त करते हैं, इसलिए वे उन मामलों में अपेक्षित परिणाम देंगे जहां C- शैली की गलतियां गलत कार्य करेंगी (विशेष प्रकार के टेम्पलेट मापदंडों के रूप में)।

इसके अलावा, मैं कहता हूं कि अगर आप किसी विशिष्ट मुद्दे की जरूरत है तो C ++ - शैली की कास्ट का उपयोग करें - डायनेमिक_कास्ट सबसे आम है, लेकिन यहां तक ​​कि शायद हर दिन की चीज नहीं है।

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.