2014-10-21 7 views
5

मैं एक एपीआई के लिए कुछ नमूना कोड देख रहा हूं जिसका उपयोग मैं शुरू करना चाहता हूं।क्या इस कोड में स्ट्रिंग अक्षर पर const_cast का उपयोग करने का कोई कारण है?

char* str; 
str = const_cast<char*>("Hello World"); 

printf("%s ", str); 

(। वास्तव में वहाँ एक बहुत बड़ा मामला बयान है जिसमें str प्रत्येक मामले में असाइन किया गया है है)

ध्यान दें कि printfconst char* लेता है: निम्नलिखित पैटर्न में थोड़ा उलझन में मुझे है। क्या इस घुलनशील रूपांतरण के लिए कोई उचित उद्देश्य है? इस कोड के लेखक कहीं और प्रदर्शन उन्मुख चाल लागू कर रहे हैं, लेकिन यहां क्या हो रहा है इसके बारे में कोई स्पष्टीकरण नहीं है। कुछ

const char* str; 
str = "Hello World"; 

printf("%s ", str); 

मुझे याद आ रही:

मेरे वृत्ति के लिए इस कोड को बदलने के लिए है?

+6

इसे बदलें। मूल कोड खतरनाक रूप से अपरिभाषित व्यवहार भूमि के करीब है। –

+0

हाँ 'रखता है' वही काम नहीं करता है। यद्यपि अन्य स्थितियों में 'बेहतर' क्यों बेहतर विकल्प होगा? –

+0

@ValekHalfHeart ओह, हाँ, वह बकवास था, कभी नहीं। – Columbo

उत्तर

3

एक स्ट्रिंग शाब्दिक सी ++ में एक गैर-कॉन्स char[N] और const char[N] है। सी ++ मानक के पहले संस्करणों ने const स्ट्रिंग अक्षर के लिए विशेष भत्ता बनाया था, जो सी के साथ पिछड़ा संगतता के लिए गैर-कॉन्स char* को असाइन किया गया था। हालांकि, यह व्यवहार सी ++ 03 में बहिष्कृत किया गया था और अब सी ++ 11 में अवैध है एक स्पष्ट कलाकार, जैसे दिखाया गया है।

यदि आप केवल सी ++ 11 में रुचि रखते हैं, तो आपको str से const char* में बदलना चाहिए। अन्यथा, आप पीछे की संगतता के लिए कास्ट का उपयोग कर सकते हैं।

+1

दिलचस्प। मुझे संदेह है कि यह बैकस्ट्रीरी है। प्रश्न में कोड में क्रॉस-प्लेटफार्म मौसा बहुत सारे हैं। मैं सी ++ 11 का उपयोग कर रहा हूं, लेकिन यह कोड शायद सी ++ 03 से पहले वापस चला जाता है। कॉन्स और रीडोनली के बीच आप क्या भेद करते हैं? मैंने अक्सर सोचा है कि क्या होगा यदि आपने एक स्ट्रिंग अक्षर को संशोधित करने का प्रयास किया था। –

+0

@ ड्रू भाषा आपको इसे संशोधित करने की अनुमति दे सकती है, लेकिन इसका मतलब यह नहीं है कि ऐसा करना सुरक्षित है। –

+0

@remyabel, सहमत हुए। लेकिन आप वास्तव में इस मामले में क्या बदल रहे हैं? यदि एक स्ट्रिंग अक्षर को कोड में डुप्लिकेट किया गया है, और संकलक निष्पादन योग्य के भीतर उन्हें समेकित करता है, तो क्या यह एक और उदाहरण बदल रहा होगा? क्या स्मृति का क्षेत्र संरक्षित किया जा सकता है? मुझे लगता है कि इन सवालों का जवाब 'यह निर्भर करता है' :) –

2

एकमात्र संभावित कारण यह हो सकता है कि printf को कुछ विशेष कार्यान्वयन में char* की आवश्यकता हो। जो, कुछ शोध के बाद, ऐसा नहीं लगता है। दूसरी तरफ, एक स्ट्रिंग अक्षर पर इंगित करने वाले गैर-कॉन्स char पर पॉइंटर होने के कारण एक स्ट्रिंग शाब्दिक ट्रिगर अपरिभाषित व्यवहार को संशोधित करने के रूप में खतरनाक है। यदि यह कलाकारों के बिना काम करता है तो वहां पहुंचने का कोई कारण नहीं है और आपको इसे तुरंत बदलना चाहिए।

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