2009-09-05 16 views
25

सी ++ से reinterpret_cast के लिए सी समतुल्य क्या है?reinterpret_cast के लिए सी समकक्ष क्या है?

+20

ध्यान दें कि सी (+ टाइप) एक्सट्रेशन सी सी के बराबर सी ++ में 'reinterpret_cast' से अधिक कुछ कर सकता है (ठीक है, आखिरकार, वे दो अलग-अलग भाषाएं हैं - इसलिए हम वैसे भी ज्यादा उम्मीद नहीं कर सकते हैं)। यह एक दूसरे में पूर्णांक और फ़्लोटिंग बिंदु प्रकार कास्ट कर सकते हैं। उत्तर से निष्कर्ष निकालें कि सी ++ में '(प्रकार) अभिव्यक्ति '' reinterpret_cast' के बराबर है। –

+0

@litb यह एक दिलचस्प टिप्पणी है। मैंने वीसी -2008 द्वारा उत्पादित असेंबली कोड की जांच की और यह एक ही कोड को छोड़ देता है। मुझे यकीन है कि यह पर्याप्त नहीं है, लेकिन मैं वास्तव में यह जानना चाहता हूं कि यह कब भिन्न होता है? – AraK

+0

संकलन समय त्रुटि और अपरिभाषित व्यवहार के अलग-अलग मामले: 'int a = reinterpret_cast ('a'); '(संकलन त्रुटि)। 'संरचना ए {int ए; }; संरचना बी {int बी; }; संरचना सी: ए, बी {int सी; }; int मुख्य() {सी सी; बी एंड बी = reinterpret_cast <बी &>(c); बी.बी = 1; } '(अपरिभाषित व्यवहार: जब आप' (बीएंड) सी' में बदलते हैं तो अंतर देखें: यदि बी उप-ऑब्जेक्ट ऑफसेट '! = 0x0' पर संग्रहीत है, तो' reinterpret_cast' को किसी भी समायोजन की परवाह करने की आवश्यकता नहीं है , जबकि एक सी-स्टाइल कास्ट करेगा। –

उत्तर

22
int *foo; 
float *bar; 

// c++ style: 
foo = reinterpret_cast< int * >(bar); 

// c style: 
foo = (int *)(bar); 
+4

कृपया मूल प्रश्न पर टिप्पणियों में लिटब का बहुत अच्छा बिंदु भी ध्यान दें। – Crashworks

4

सी शैली सिर्फ कोष्टक में प्रकार के नाम की तरह लग रहे डाले:

void *p = NULL; 
int i = (int)p; // now i is most likely 0 

जाहिर है इस से डाले के लिए बेहतर उपयोग करता है, लेकिन है कि बुनियादी वाक्य रचना है।

+1

क्यों 'सबसे अधिक संभावना' ? यहां अपवाद क्या होगा? – bzeaman

1

एक सी शैली डाली है:

int* two = ...; 
pointerToOne* one = (pointerToOne*)two; 
+0

यह नहीं होना चाहिए कि '==' एकल हो '=' '? – KPexEA

+0

दोनों वैध कथन हैं, और दोनों केवल कलाकारों के कारण संकलित होंगे। बेशक, यदि आप संकलन के अलावा कुछ और करना चाहते हैं, तो आप '=' – MSalters

0

आप स्वतंत्र रूप से सूचक प्रकार डाल सकता के रूप में आप किसी भी अन्य प्रकार होगा सी में।

पूरा होने के लिए:

void *foo; 
some_custom_t *bar; 
other_custom_t *baz; 
/* Initialization... */ 
foo = (void *)bar; 
bar = (some_custom_t *)baz; 
baz = (other_custom_t *)foo; 
+4

का उपयोग करेंगे, आप किसी भी प्रकार का स्वतंत्र रूप से कास्ट कर सकते हैं, यह संभवतः ऐसा नहीं कर सकता जो आपको उम्मीद है, और शायद कुछ भी करने की गारंटी नहीं दी जा सकती है। –

2

यह मौजूद नहीं है, क्योंकि reinterpret_cast बदल नहीं सकते [constness] [3]। उदाहरण के लिए,

int main() 
{ 
    const unsigned int d = 5; 
    int *g=reinterpret_cast< int* >(&d); 
    (void)g; 
} 

त्रुटि उत्पन्न करेगा:

dk.cpp: In function 'int main()':
dk.cpp:5:41: error: reinterpret_cast from type 'const unsigned int*' to type 'int*' casts away qualifiers

1

आप मूल्य का पता ले जा सकते हैं, तो एक तरह से एक अलग प्रकार के सूचक के लिए यह करने के लिए एक सूचक कास्ट करने के लिए है, और फिर पॉइंटर को कम करें।

उदाहरण के लिए, एक नाव करने के लिए पूर्णांक रूपांतरण:

int main() 
{ 
    float f = 1.0f; 

    printf ("f is %f\n", f); 
    printf ("(int) f is %d\n", (int)f); 
    printf ("f as an unsigned int:%x\n", *(unsigned int *)&f); 
} 

आउटपुट:

f is 1.000000 
(int) f is 1 
f as an unsigned int:3f800000 

ध्यान दें कि यह शायद सी मानक से काम करने के लिए गारंटी नहीं है। आप फिर भी फ्लोट से int तक कास्ट करने के लिए reinterpret_cast का उपयोग नहीं कर सकते हैं, लेकिन यह एक प्रकार के समान होगा जो समर्थित था (उदाहरण के लिए, विभिन्न सूचक प्रकारों के बीच)।

चलो उपर्युक्त आउटपुट को समझ में आता है, वैसे भी।

http://en.wikipedia.org/wiki/Single_precision_floating-point_format#IEEE_754_single-precision_binary_floating-point_format:_binary32

बाइनरी में पिछले जवाब:

यह आईईईई-754 चल बिन्दु स्वरूप है: 0 की निशानी बिट, एक 8 के बाद -बीबी एक्सपोनेंट (011 1111 1), इसके बाद 23 बिट मंटिसा (सभी शून्य)।

प्रतिपादक की व्याख्या करने के लिए, घटाना 127: 01111111b = 127, और 127 - 127 = 0. प्रतिपादक 0.

अपूर्णांश व्याख्या करने के लिए, 1 एक दशमलव बिंदु के बाद के बाद इसे लिखने है: 1.00000000000000000000000 (23 शून्य)। यह दशमलव में 1 है।

इसलिए हेक्स 3f800000 द्वारा प्रतिनिधित्व किया गया मान 1 * 2^0 = 1 है, जैसा कि हमने उम्मीद की थी।

0

क्या ग के लिए एक REINTERPRET ऑपरेटर के बारे में:

#define REINTERPRET(new_type, var) (* ((new_type *) & var)) 

मैं, कहते हैं "reinterpret_cast" पसंद नहीं है क्योंकि कलाकारों रूपांतरण (ग में) का अर्थ है, पुनर्व्याख्या विपरीत मतलब है, जबकि: कोई रूपांतरण।

+2

किसी को ऐसा क्यों करना चाहिए? यह भ्रामक है। अपना कोड अपरिवर्तित जटिल नहीं बनाओ। –

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