c सी 99 में अनिर्दिष्ट संघ के माध्यम से टाइप-पनिंग है, और क्या यह सी 11 में निर्दिष्ट हो गया है?




c99 unions (4)

स्टैक ओवरफ़्लो प्रश्न के लिए कई उत्तरों आईईईई सिंगल-प्रेसिजन बिट्स को फ़्लोट के लिए union स्ट्रक्चर का उपयोग करके सुझाव देते हैं, उदाहरण के लिए पनिंग के लिए union स्ट्रक्चर का उपयोग करना (उदाहरण: एक float की बिट्स को uint32_t में बदलना):

union {
    float f;
    uint32_t u;
} un;
un.f = your_float;
uint32_t target = un.u;

हालांकि, यूनियन के uint32_t सदस्य का मूल्य C99 मानक (कम से कम ड्राफ्ट n1124) के अनुसार निर्दिष्ट नहीं किया गया है, जहां सेक्शन 6.2.6.1.7 कहता है:

जब यूनियन प्रकार के ऑब्जेक्ट के किसी सदस्य के किसी सदस्य में कोई मान संग्रहीत किया जाता है, ऑब्जेक्ट प्रस्तुति के बाइट जो उस सदस्य के अनुरूप नहीं होते हैं लेकिन अन्य सदस्यों के अनुरूप करते हैं, वे निर्दिष्ट मान लेते हैं।

सी 11 एन 1570 ड्राफ्ट के कम से कम एक फुटनोट का अर्थ यह है कि यह अब मामला नहीं है (6.5.2.3 में फुटनोट 95 देखें):

यदि सदस्य किसी ऑब्जेक्ट ऑब्जेक्ट की सामग्री को पढ़ने के लिए उपयोग किया जाता है तो वह ऑब्जेक्ट में किसी मान को संग्रहीत करने के लिए उपयोग किए जाने वाले सदस्य के समान नहीं होता है, तो मान के ऑब्जेक्ट प्रस्तुति के उचित भाग को नए प्रकार में ऑब्जेक्ट प्रस्तुति के रूप में पुन: परिभाषित किया जाता है 6.2.6 में वर्णित (एक प्रक्रिया जिसे कभी-कभी '' टाइप पनिंग 'कहा जाता है)। यह एक जाल प्रतिनिधित्व हो सकता है।

हालांकि, खंड 6.2.6.1.7 का पाठ C99 ड्राफ्ट में सी 11 ड्राफ्ट में समान है।

क्या यह व्यवहार वास्तव में सी 99 के तहत अनिर्दिष्ट है? क्या यह सी 11 में निर्दिष्ट हो गया है? मुझे एहसास है कि अधिकांश कंपाइलर्स इसका समर्थन करते हैं, लेकिन यह जानना अच्छा होगा कि यह मानक में निर्दिष्ट है, या सिर्फ एक बहुत ही आम एक्सटेंशन है।


हालांकि, ऐसा लगता है कि यह सी 99 मानक (कम से कम ड्राफ्ट एन 1124) का उल्लंघन करता है, जहां धारा 6.2.6.1.7 कुछ सामान बताती है। क्या यह व्यवहार वास्तव में सी 99 के तहत अनिर्दिष्ट है?

नहीं, तुम ठीक हो।

जब यूनियन प्रकार के ऑब्जेक्ट के किसी सदस्य के किसी सदस्य में कोई मान संग्रहीत किया जाता है, ऑब्जेक्ट प्रस्तुति के बाइट जो उस सदस्य के अनुरूप नहीं होते हैं लेकिन अन्य सदस्यों के अनुरूप करते हैं, वे निर्दिष्ट मान लेते हैं।

यह विभिन्न आकारों के डेटा ब्लॉक पर लागू होता है। हां, अगर आपके पास है:

union u
{
    float f;
    double d;
};

और आप f को कुछ असाइन करते हैं, यह डी के निम्न 4 बाइट्स को बदल देगा, लेकिन ऊपरी 4 बाइट एक अनिश्चित स्थिति में होंगे।

यूनियन मुख्य रूप से टाइपिंग पनिंग के लिए मौजूद हैं।


यह हमेशा "iffy" रहा है। जैसा कि अन्य ने नोट किया है कि एक तकनीकी कोर्रेजेंडम के माध्यम से सी 99 में एक फुटनोट जोड़ा गया था। यह निम्नानुसार पढ़ता है:

यदि सदस्य किसी ऑब्जेक्ट ऑब्जेक्ट की सामग्री तक पहुंचने के लिए उपयोग किया जाता है तो वह ऑब्जेक्ट में किसी मान को संग्रहीत करने के लिए उपयोग किए गए सदस्य के समान नहीं होता है, तो मान के ऑब्जेक्ट प्रस्तुति के उचित भाग को नए प्रकार में ऑब्जेक्ट प्रस्तुति के रूप में पुन: परिभाषित किया जाता है 6.2.6 में वर्णित (एक प्रक्रिया जिसे कभी-कभी "टाइप पनिंग" कहा जाता है)। यह एक जाल प्रतिनिधित्व हो सकता है।

हालांकि, फ़ोरनोट्स को गैर-मानक के रूप में फ़ोरवर्ड में निर्दिष्ट किया गया है:

अनुलग्नक डी और एफ इस मानक का एक मानक हिस्सा बनाते हैं; ए, बी, सी, ई, जी, एच, आई, जे, ग्रंथसूची, और सूचकांक केवल जानकारी के लिए हैं। आईएसओ / आईईसी निर्देशों के भाग 3 के अनुसार, यह प्रस्ताव, परिचय, नोट्स, फुटनोट, और उदाहरण केवल जानकारी के लिए भी हैं

यही है, फुटनोट व्यवहार की संभावना नहीं बना सकते हैं; उन्हें केवल मौजूदा पाठ को स्पष्ट करना चाहिए। यह एक अलोकप्रिय राय है, लेकिन उपरोक्त उद्धृत फुटनोट वास्तव में इस संबंध में विफल रहता है - मानक पाठ में ऐसा कोई व्यवहार नहीं है। दरअसल, 6.7.2.1 जैसे भाग हैं:

... सदस्यों में से किसी एक का मूल्य किसी भी समय यूनियन ऑब्जेक्ट में संग्रहीत किया जा सकता है

6.5.2.3 के साथ संयोजन ("ऑपरेटर" के साथ संघ के सदस्यों तक पहुंचने के संबंध में):

मूल्य नामित सदस्य का है

यदि मैं केवल एक सदस्य का मूल्य संग्रहीत किया जा सकता है, तो दूसरे सदस्य का मूल्य मौजूद नहीं है। यह दृढ़ता से तात्पर्य है कि संघ के माध्यम से दंड टाइप करना संभव नहीं होना चाहिए; सदस्य पहुंच एक अस्तित्व मूल्य पैदा करता है। सी 11 दस्तावेज़ में वही पाठ अभी भी मौजूद है।

हालांकि, यह स्पष्ट है कि फुटनोट जोड़ने का उद्देश्य टाइप-पनिंग की अनुमति देना था; यह सिर्फ इतना है कि समिति ने फुटनोट्स पर नियमों को तोड़ दिया, जिसमें मानक पाठ नहीं था। फुटनोट को स्वीकार करने के लिए, आपको वास्तव में उस खंड को अवहेलना करना है जो कहता है कि फुटनोट मानक नहीं हैं, या अन्यथा यह पता लगाने की कोशिश करें कि मानक पाठ को कैसे समझना है जो फुटनोट के निष्कर्ष का समर्थन करता है (जिसे मैंने कोशिश की है, और असफल, करने के लिए)।

जिस अनुभाग में आप उद्धरण देते हैं:

जब यूनियन प्रकार के ऑब्जेक्ट के किसी सदस्य के किसी सदस्य में कोई मान संग्रहीत किया जाता है, ऑब्जेक्ट प्रस्तुति के बाइट जो उस सदस्य के अनुरूप नहीं होते हैं लेकिन अन्य सदस्यों के अनुरूप करते हैं, वे निर्दिष्ट मान लेते हैं।

... हालांकि ध्यान से पढ़ना है। "ऑब्जेक्ट प्रस्तुति के बाइट्स जो उस सदस्य के अनुरूप नहीं हैं " सदस्य के आकार से परे बाइट्स का जिक्र कर रहा है, जो खुद को दंडित करने के लिए कोई मुद्दा नहीं है (सिवाय इसके कि आप एक यूनियन सदस्य को लिखना नहीं मान सकते हैं किसी भी बड़े सदस्य के छेड़छाड़ के "अतिरिक्त" भाग)।


यूनियन के साथ दंडित प्रकार का व्यवहार C89 से C99 में बदल गया। सी 99 में व्यवहार सी 11 के समान है।

चूंकि Wug ने अपने जवाब में उल्लेख किया, सी 99 / सी 11 में Wug की अनुमति है। एक अनिर्दिष्ट मूल्य जो एक जाल हो सकता है जब संघ के सदस्य अलग-अलग आकार के होते हैं।

क्लाइव डीडब्ल्यू फेदर दोष रिपोर्ट # 257 के बाद सी 99 में फुटनोट जोड़ा गया था:

आखिरकार, सी 9 0 से सी 99 में किए गए बदलावों में से एक यूनियन के एक सदस्य तक पहुंचने पर किसी भी प्रतिबंध को हटाने के लिए था जब अंतिम स्टोर एक अलग था। तर्क यह था कि व्यवहार मूल्यों के प्रतिनिधित्व पर निर्भर करेगा। चूंकि इस बिंदु को अक्सर गलत समझा जाता है, इसलिए यह मानक में स्पष्ट होने के लायक हो सकता है।

[...]

"पनिंग टाइप करें" के बारे में इस मुद्दे को हल करने के लिए, 6.5.2.3 # 3: 78 ए में "नामित सदस्य" शब्दों में एक नया फुटनोट 78 ए संलग्न करें यदि सदस्य संघ की सामग्री तक पहुंचने के लिए उपयोग किया गया सदस्य सदस्य के समान नहीं है ऑब्जेक्ट में मान को संग्रहीत करने के लिए उपयोग किया जाता है, मान के ऑब्जेक्ट प्रस्तुति के उचित भाग को 6.2.6 में वर्णित नए प्रकार में ऑब्जेक्ट प्रस्तुति के रूप में दोहराया जाता है (एक प्रक्रिया जिसे कभी-कभी "टाइप पनिंग" कहा जाता है)। यह एक जाल प्रतिनिधित्व हो सकता है।

सीटी कमेटी फॉर डिफेक्ट रिपोर्ट # 283 के उत्तर में क्लाइव डीडब्ल्यू फेदर का शब्द तकनीकी कोर्रिजेंडम के लिए स्वीकार किया गया था।


मूल सी 99 विनिर्देश ने इसे निर्दिष्ट नहीं छोड़ा।

सी 99 (टीआर 2, मुझे लगता है) के तकनीकी corrigenda में से एक इस निरीक्षण को सही करने के लिए फुटनोट 82 जोड़ा:

यदि सदस्य किसी ऑब्जेक्ट ऑब्जेक्ट की सामग्री तक पहुंचने के लिए उपयोग किया जाता है तो वह ऑब्जेक्ट में किसी मान को संग्रहीत करने के लिए उपयोग किए गए सदस्य के समान नहीं होता है, तो मान के ऑब्जेक्ट प्रस्तुति के उचित भाग को नए प्रकार में ऑब्जेक्ट प्रस्तुति के रूप में पुन: परिभाषित किया जाता है 6.2.6 में वर्णित (एक प्रक्रिया जिसे कभी-कभी "टाइप पनिंग" कहा जाता है)। यह एक जाल प्रतिनिधित्व हो सकता है।

उस फुटनोट को सी 11 मानक में रखा गया है (यह सी 11 में फुटनोट 95 है)।





type-punning