2009-03-18 18 views
61

const करने के लिए मेरे पास है:C++ शैली डाली चार *

unsigned char *foo(); 
std::string str; 
str.append(static_cast<const char*>(foo())); 

त्रुटि: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’

C++ शैली में यहां कास्ट करने के लिए सही तरीका क्या है?

+3

अहस्ताक्षरित चार आम तौर पर यूनिकोड शैली तार आयोजित करने के लिए इस्तेमाल किया गया है, क्या आप वाकई इसे सीधे नहीं बल्कि सामग्री परिवर्तित कास्ट करना चाहते हैं कर रहे हैं? –

उत्तर

39

reinterpret_cast

+36

उदाहरण कृपया? –

+5

@ jesses.co.tt डाउनवोट के लिए धन्यवाद। इस पोस्ट की मुख्य विशेषता जो इसे ऊपर उठाती है वह इसकी समयबद्धता है। अन्य उत्तर विभिन्न विवरण प्रदान करते हैं और अलग-अलग पढ़े जाते हैं और अलग-अलग होते हैं। यदि [@ जेरेडर्स उत्तर] (http://stackoverflow.com/a/658924/11635) जो आप खोज रहे हैं उसे शामिल करता है, तो मैं इसका उपयोग करता हूं और/या इसे ऊपर उठाता हूं। आप ध्यान दें कि मैंने उन लोगों के प्रारूप को बेहतर बनाने के लिए समय भी निवेश किया है। मैं वास्तव में दूसरों के सामग्री को शामिल करने के लिए इस उत्तर का विस्तार करने का बिंदु नहीं देखता हूं। –

+1

ठीक है, मैं समझता हूं कि आप यहां तर्कसंगत हैं, और पूरे पृष्ठ के रूप में लिया गया है, मैं मानता हूं कि पुन: स्पष्ट करने की कोई आवश्यकता नहीं थी ... मुझे लगता है कि समय लेना और पूरे पृष्ठ और टाइमस्टैम्प को देखना मुश्किल है अपने उत्तर पर प्रत्येक उत्तर का न्याय करने के लिए ... लेकिन बिंदु ले लिया (विशेष रूप से किसी ऐसे व्यक्ति से जिसकी 55x अधिक प्रतिष्ठा है!) –

6

तुम एक दो के रूप में reinterpret_cast<> प्रकार का उपयोग करने के लिए आप के बीच कास्ट कर रहे हैं की आवश्यकता होगी एक दूसरे से संबंधित नहीं हैं।

39

reinterpret_cast

unsigned char *foo(); 
std::string str; 
str.append(reinterpret_cast<const char*>(foo())); 
51

char * और const unsigned char * असंबंधित प्रकार माना जाता है की कोशिश करो। तो आप reinterpret_cast का उपयोग करना चाहते हैं।

लेकिन यदि आप const unsigned char* सेप्रकार पर जा रहे थे तो आपको पहले const_cast का उपयोग करना होगा। reinterpret_castconst या volatile योग्यता को हटा नहीं सकता है।

15

हस्ताक्षरित चार * मूल रूप से एक बाइट सरणी है और आम तौर पर एक स्ट्रिंग के बजाय कच्चे डेटा का प्रतिनिधित्व करने के लिए उपयोग किया जाना चाहिए। एक यूनिकोड स्ट्रिंग का प्रतिनिधित्व wchar_t *

सी ++ मानक के अनुसार बिना हस्ताक्षर किए गए char * और char * के बीच एक reinterpret_cast सुरक्षित है क्योंकि वे एक ही आकार के हैं और समान निर्माण और बाधाएं हैं। मैं सामान्य रूप से const_cast से भी reintrepret_cast से बचने की कोशिश करता हूं।

यदि स्थिर कलाकार आपके द्वारा किए जा रहे कार्यों में विफल रहता है तो आप अपने डिज़ाइन पर पुनर्विचार करना चाहेंगे क्योंकि स्पष्ट रूप से यदि आप सी ++ का उपयोग कर रहे हैं तो आप "प्लस प्लस" भाग ऑफ़र का उपयोग करना और स्ट्रिंग क्लासेस और एसटीएल (उर्फ std :: basic_string आपके लिए बेहतर काम कर सकते हैं)

-3

Hope it help. :)

const unsigned attribName = getname(); 
const unsigned attribVal = getvalue(); 
const char *attrName=NULL, *attrVal=NULL; 
attrName = (const char*) attribName; 
attrVal = (const char*) attribVal; 
+6

डाउनवोट: बहुत उपयोगी नहीं है, और निश्चित रूप से सी ++ तरीका नहीं है। – Lstor

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