2013-02-23 19 views
10

यहाँ एक कोड है -अमान्य रूपांतरण करने के लिए *

1 int main(int argc, char *argv[]) 
    2 { 
    3  signed char S, *psc; 
    4  unsigned char U, *pusc; 
    5  char C, *pc; 
    6 
    7  C = S; 
    8  C = U; 
    9 
10  pc = psc; 
11  pc = pusc; 
12 
13  return 0; 
14 } 

$ gcc test.cpp -o a 
test.cpp: In function ‘int main(int, char**)’: 
test.cpp:10:7: error: invalid conversion from ‘signed char*’ to ‘char*’ [-fpermissive] 
test.cpp:11:7: error: invalid conversion from ‘unsigned char*’ to ‘char*’ [-fpermissive] 

यह एक इंटेल 32-बिट मशीन पर उबंटू 12.10 पर जीसीसी संस्करण 4.6.3 पर संकलित किया गया है।

कि char प्रकार को ध्यान में रखते unsigned char 86 पर है। -

यदि गैर-सूचक प्रकार के लिए लाइन 7 और 8 पर असाइनमेंट ठीक है, तो लाइन 10 और 11 पर पॉइंटर प्रकारों के लिए त्रुटियों को क्यों फेंक दिया जाता है?

इसके अलावा, C = U किसी कलाकार की आवश्यकता के बिना सफल होना चाहिए?

+0

क्या आप इस शब्द ["सख्त एलियासिंग"] से परिचित हैं (http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html)? – WhozCraig

+0

उस सामान को पढ़ना ... – nightlytrails

+1

'-fpermissive' आपकी मदद कर सकता है, और इस त्रासदी को अनदेखा कर सकता है। समय-समय पर आप अस्थायी रूप से टैग को फिर से निकालना चाहते हैं और देख सकते हैं कि आपके कंपाइलर को आपके प्रोजेक्ट में इस से अन्य त्रुटियां मिलती हैं कि आपको * चिंता करना चाहिए। – rsethc

उत्तर

1

सी ++ में स्वचालित सूचक रूपांतरण नहीं है, इससे कोई फर्क नहीं पड़ता कि असाइनमेंट के प्रत्येक पक्ष पर पॉइंटर प्रकार क्या हैं, यदि वे अलग हैं, तो आपको एक कलाकार की आवश्यकता है।

1

charunsigned char और signed char से एक अलग प्रकार है। यह केवल उनमें से एक के बराबर मूल्य प्रतिनिधित्व करने की गारंटी है, लेकिन यह अभी भी एक विशिष्ट प्रकार है। इसलिए आप unsigned char* या signed char* से char* (यानी, जब तक आप reinterpret_cast का उपयोग नहीं करते) से कनवर्ट नहीं कर सकते हैं। सी ++ सिर्फ इस तरह के विशिष्ट प्रकारों के बीच सूचक रूपांतरण की अनुमति नहीं देता है, क्योंकि तब एक प्रकार दूसरे के रूप में मास्कराइड कर सकता है।

हालांकि, char के लिए या तो unsigned char या signed char से एक रूपांतरण बिल्कुल ठीक है क्योंकि यह सिर्फ अपने मूल्य का रूपांतरण किया जाता है।

यह इस तरह से विचार करें: यदि आप एक float के लिए एक int में बदल सकते हैं, लेकिन आप एक float* के लिए एक int* परिवर्तित नहीं कर सकते।

6

सबसे पहले, यह इस तथ्य पर जोर देना है कि char, signed char, और unsigned char सभी विभिन्न प्रकार हैं महत्वपूर्ण है। सी ++ 11 स्टैंडर्ड की धारा 4.10 विभिन्न प्रकार के संकेत दिए गए के बीच तीन संभावित मानक सूचक रूपांतरण परिभाषित करता है:

1। एक शून्य सूचक स्थिरांक एक अभिन्न निरंतर अभिव्यक्ति (5.1 9) पूर्णांक प्रकार का प्रसार होता है जो शून्य या किसी प्रकार के std :: nullptr_t का मूल्यांकन करता है। एक शून्य सूचक स्थिर को एक सूचक प्रकार में परिवर्तित किया जा सकता है; नतीजा उस प्रकार का शून्य सूचक मूल्य है और ऑब्जेक्ट पॉइंटर या फ़ंक्शन पॉइंटर प्रकार के हर दूसरे मूल्य से अलग है। इस तरह के एक रूपांतरण को शून्य सूचक रूपांतरण कहा जाता है। एक ही प्रकार के दो शून्य सूचक मूल्य बराबर की तुलना करेंगे। सीवी-क्वालिफाइड प्रकार के पॉइंटर को निरंतर एक शून्य सूचक का रूपांतरण एक एकल रूपांतरण है, और एक सूचक रूपांतरण के अनुक्रम का अनुक्रम रूपांतरण (4.4) के बाद नहीं है। अभिन्न प्रकार के एक शून्य सूचक स्थिरांक प्रकार std :: nullptr_t के रूप में परिवर्तित किया जा सकता है। [नोट: परिणामी प्रसार एक शून्य सूचक मूल्य नहीं है। -जेंड नोट]

यह प्रासंगिक नहीं है, क्योंकि हमारे पास nulltptr_t प्रकार के शून्य पॉइंटर्स नहीं हैं।

2। टाइप "पॉइंटर टू सीवी टी" का एक उदाहरण, जहां टी एक ऑब्जेक्ट प्रकार है, को "पॉइंटर से सीवी शून्य" के रूप में परिवर्तित किया जा सकता है।एक "पॉइंटर से सीवी टी" को "सूचक से सीवी शून्य" में परिवर्तित करने का नतीजा भंडारण स्थान की शुरुआत के लिए इंगित करता है जहां टाइप टी का ऑब्जेक्ट रहता है, जैसे कि ऑब्जेक्ट प्रकार का सबसे व्युत्पन्न ऑब्जेक्ट (1.8) है (यानी, बेस क्लास सबोबजेक्ट नहीं है)। शून्य सूचक मान को गंतव्य प्रकार के शून्य सूचक मान में परिवर्तित किया जाता है।

यह लागू नहीं हो सकता है, क्योंकि गंतव्य प्रकार void नहीं है। अंत में,

3। टाइप "पॉइंटर टू सीवी डी", जहां डी एक वर्ग प्रकार है, को "पॉइंटर से सीवी बी" के रूप में परिवर्तित किया जा सकता है, जहां बी डी का बेस क्लास (क्लॉज 10) है। यदि बी एक है अपर्याप्त (खंड 11) या संदिग्ध (10.2) डी के आधार वर्ग, एक कार्यक्रम जो इस रूपांतरण की जरुरत है, खराब है। रूपांतरण का नतीजा व्युत्पन्न वर्ग वस्तु के बेस क्लास सबोबजेक्ट के लिए एक सूचक है। शून्य सूचक मान को गंतव्य प्रकार के शून्य सूचक मान में परिवर्तित कर दिया गया है।

signed char, char का एक आधार वर्ग नहीं है तो भी यह नहीं लागू होता है।

इसलिए, signed char से char पर एक निहित, मानक सूचक रूपांतरण निष्पादित नहीं किया जा सकता है।

दूसरी ओर, अभिन्न प्रकार के मानों के बीच रूपांतरण अनुच्छेद 4.7 में निर्दिष्ट अनुसार के अनुसार अनुमति है।

+1

मुझे लगता है कि जोर देना महत्वपूर्ण है कि 'char',' unsigned char 'और' हस्ताक्षरित char' 3 अलग-अलग प्रकार हैं। मुझे संदेह है कि सवाल एक गलतफहमी से आता है, कि 'char' या तो' हस्ताक्षरित char 'या' हस्ताक्षरित char' है। –

+0

@MaciejHehl: सच है। मैंने जवाब संपादित किया, धन्यवाद। –

0

मैं गलत हो सकता था, लेकिन ऊपर कहा गया है, जब आपने "सी = एस; सी = यू" असाइन किया है, तो सी ++ स्वचालित रूप से इसे परिवर्तित करता है, जैसे कि आप "char x =" h "करते हैं; printf ("% मैं ", एक्स);"। हालांकि, पॉइंटर्स स्मृति में एक विशिष्ट स्थान को इंगित करते हैं, और उस स्थान का आकार होता है। इसलिए जब प्रकार को परिवर्तित करना एक अलग कोण से मूल्यों को देखता है, तो अलग-अलग मानों को इंगित करने में उस मूल्य के आकार को बदलना शामिल हो सकता है जिस पर ध्यान दिया जा रहा है।

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