2012-07-25 81 views
7

क्या इसक्या मुझे वास्तव में आदिम प्रकारों के बीच कनवर्ट करना चाहते हैं, हर बार static_cast का उपयोग करना चाहिए?

long l = 1; 
char c = static_cast<char>(l); 

float f = 1.0f; 
int i = static_cast<int>(f); 

इस

long l = 1; 
char c = (char)l; 

float f = 1.0f; 
int i = (int)f; 

की तुलना में बेहतर जब एक आदिम डेटा प्रकार कास्टिंग बनाता है?

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

+2

आपको [Bjarne Stroustrup का उत्तर] (http://stroustrup.com/bs_faq2.html#static-cast) एक अच्छा पढ़ा जा सकता है। – chris

उत्तर

21

भविष्य-प्रमाणन।

के भविष्य मैं यह करने में मान लीजिए:

float blah = 1.0f; 
float* f = &blah; 

अब, int i = static_cast<int>(f); बंद हो जाता है संकलन है, लेकिन int i = (int)f; एक reinterpret_cast करता है।

static_cast<int>यह वही है जो मैं चाहता हूं कि आप करें। (int)जो भी आप मुझे int प्राप्त करने के लिए कर सकते हैं। उत्तरार्द्ध के साथ, संकलक आपको int मान प्राप्त करने के रास्ते से बाहर निकल जाएगा, और यह शायद ही कभी (कभी नहीं?) वांछनीय है।

+0

वास्तव में वांछनीय नहीं है, लेकिन ऐसा होता है। उदाहरण के लिए, से संभव रिटर्न में से एक [इस समारोह] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633585 (v = vs.85) .aspx) एक समारोह सूचक है। फ़ंक्शन का रिटर्न प्रकार या तो 'लंबा' या '__int64' है। – chris

+0

@ क्रिस ओह, यह अजीब है। लेकिन एक 'reinterpret_cast' वैसे भी ठीक काम करेगा। वास्तव में –

+0

। अधिकांश एपीआई सी से सीधे है, और वे सभी प्रकार के "हैक्स" का उपयोग करने के लिए करते हैं जो उन्हें चाहिए। – chris

1

सी-स्टाइल कास्ट के साथ समस्या यह है कि यह आपको उन रूपांतरणों को करने दे सकता है जिन्हें आप इरादा नहीं चाहते थे।

ऐसा कुछ है जो आपको भविष्य में करना चाहिए, लेकिन जब तक आपको कोई समस्या न मिल जाए तब तक मैं वापस नहीं जाऊंगा और इसे बदलूंगा।

6

हां, आपको चाहिए।

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

एक static_cast अधिक दृश्यमान है और पुरानी सी-स्टाइल कास्ट की तुलना में अधिक विशिष्ट है। आप उन्हें बाहर खड़े करना चाहते हैं। जब आप डिबगिंग कर रहे हों तो आप उन्हें स्पष्ट होना चाहते हैं। आप अगले प्रोग्रामर को यह समझने के लिए आना चाहते हैं कि आप इसे क्यों कर रहे हैं।

तथ्य यह है कि static_cast<blah>(foo) टाइप करना कठिन है, यह भी एक लाभ है, क्योंकि यह आपको केवल जरूरी होने पर ही डालने के लिए प्रोत्साहित करेगा।

8

हर बार एक संकेत है।

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

विरासत कोड को संबोधित करने के लिए, आप कुछ उत्तरों (मेरे स्वयं सहित) के लिए this question देख सकते हैं।

2

एक कन्स्ट्रक्टर कास्ट एक विकल्प है। माना जाता है कि एक रूपांतरण कन्स्ट्रक्टर परिभाषित किया गया है।उदाहरण के लिए:

int i(0); 
float f(3.14F); 
i = int(f); 

हालांकि आप निश्चित रूप से static_cast को प्राथमिकता देनी चाहिए और अन्य सी ++ उन के रूप में एक सी शैली डाली से अधिक डाले मूल रूप से कहते हैं कि जो अंततः एक reinterpret_cast और शायद देने के बराबर मारा जाएगा "जब तक कुछ काम करता है हर डाली कोशिश" आप गलत व्यवहार करते हैं।

+1

AFAIK 'कन्स्ट्रक्टर कास्ट' सी-स्टाइल कास्ट के बराबर है। –

+0

यह शायद * थोड़ा * अधिक प्रकार सुरक्षित है लेकिन हाँ पॉइंटर्स को पेश करते समय आपको वही समस्या मिल जाएगी। पाठ्यक्रम का आदर्श समाधान बिल्कुल नहीं डालना है और सही प्रकारों का उपयोग करना है। – AJG85

+0

जब मैं समकक्ष कहता हूं, मेरा मतलब है। 5.2.3 pt 1: एक सरल प्रकार-विनिर्देशक (7.1.6.2) या टाइपनाम-विनिर्देशक (14.6) जिसके बाद एक संश्लेषित अभिव्यक्ति-सूची अभिव्यक्ति सूची दी गई निर्दिष्ट प्रकार का मान बनाती है। अभिव्यक्ति सूची एक भी अभिव्यक्ति है, जैसे रूपांतरण अभिव्यक्ति बराबर है इसी डाली अभिव्यक्ति (5.4) से (definedness में, और अर्थ में परिभाषित किया गया है)। –