यह जीसीसी में एक ज्ञात बग है।
जीसीसी एक documented extension कि प्रपत्र
goto *ptr;
जहां ptr
प्रकार void*
के किसी भी अभिव्यक्ति हो सकती है का एक बयान परमिट है। इस एक्सटेंशन के हिस्से के रूप में, एक लेबल नाम पर एक unary &&
लागू करने से लेबल का पता void*
टाइप करता है।
अपने उदाहरण में:
int foo = 0;
goto *foo;
foo
स्पष्ट रूप से के प्रकार void*
नहीं, प्रकार int
की है। एक int
मूल्य void*
में परिवर्तित किया जा सकता है, लेकिन केवल एक स्पष्ट कलाकार के साथ (एक शून्य सूचक स्थिर के विशेष मामले को छोड़कर, जो यहां लागू नहीं होता है)।
अभिव्यक्ति *foo
स्वयं ही एक त्रुटि के रूप में सही ढंग से निदान किया गया है। और यह:
goto *42;
त्रुटि के बिना संकलित (उत्पन्न मशीन कोड एक कूद 42
संबोधित करने के लिए, अगर मैं विधानसभा कोड सही ढंग से पढ़ रहा हूँ प्रतीत होता है)।
एक त्वरित प्रयोग इंगित करता है कि जीसीसी के लिए
goto *42;
एक ही विधानसभा कोड
goto *(void*)42;
बाद दस्तावेज विस्तार के सही उपयोग है के लिए के रूप में यह होता है उत्पन्न करता है, और यह आप क्या करना चाहिए है शायद अगर, किसी कारण से, आप पता 42
मैं सबमिट करने के बाद जाने के लिए चाहते हैं एक bug report - जो जल्दी से 012 के डुप्लिकेट के रूप बंद हो गया, 2007 में प्रस्तुत किया गया।
स्रोत
2016-02-06 03:38:32
यह एक ज्ञात बग है। मेरा अद्यतन उत्तर देखें। –