मैंने पहले आराम से यूनियनों का उपयोग किया है; जब मैंने इस पोस्ट को पढ़ा तो मुझे घबराहट हुई और मुझे पता चला कि यह कोड है
union ARGB
{
uint32_t colour;
struct componentsTag
{
uint8_t b;
uint8_t g;
uint8_t r;
uint8_t a;
} components;
} pixel;
pixel.colour = 0xff040201; // ARGB::colour is the active member from now on
// somewhere down the line, without any edit to pixel
if(pixel.components.a) // accessing the non-active member ARGB::components
वास्तव में अपरिभाषित व्यवहार है जिसे संघ के एक सदस्य से पढ़ने के अलावा अन्य ने हाल ही में अपरिभाषित व्यवहार के लिए लिखा है। यदि यह यूनियनों का इच्छित उपयोग नहीं है, तो क्या है? क्या कोई इसे विस्तार से बता सकता है?
अपडेट करें:
मैं कुछ बातें स्पष्ट करना चाहता था।
- प्रश्न का उत्तर C और C ++ के लिए समान नहीं है; मेरे अज्ञानी युवा स्व ने इसे C और C ++ दोनों के रूप में टैग किया।
- C ++ 11 के मानक के माध्यम से दस्त करने के बाद, मैं निर्णायक रूप से यह नहीं कह सकता कि यह एक गैर-सक्रिय संघ के सदस्य तक पहुँचने / निरीक्षण करने को अपरिभाषित / अनिर्दिष्ट / कार्यान्वयन-परिभाषित है। सभी मैं पा सकता था §9.5 / 1:
यदि एक मानक-लेआउट संघ में कई मानक-लेआउट संरचनाएं होती हैं जो एक सामान्य प्रारंभिक अनुक्रम साझा करती हैं, और यदि इस मानक-लेआउट संघ प्रकार की एक वस्तु में मानक-लेआउट संरचना शामिल है, तो इसे किसी भी सामान्य प्रारंभिक अनुक्रम का निरीक्षण करने की अनुमति है मानक-लेआउट संरचना सदस्यों के। §9.2 / 19: दो मानक-लेआउट संरचनाएं एक सामान्य प्रारंभिक अनुक्रम साझा करती हैं यदि संबंधित सदस्यों में लेआउट-संगत प्रकार होते हैं और या तो सदस्य बिट-फ़ील्ड नहीं होते हैं या दोनों एक या अधिक प्रारंभिक अनुक्रम के लिए समान चौड़ाई वाले बिट-फ़ील्ड होते हैं सदस्य हैं।
- जबकि C में, ( C99 TC3 - DR 283 आगे) ऐसा करने के लिए कानूनी है ( इसे ऊपर लाने के लिए पास्कल कूक का धन्यवाद )। हालाँकि, ऐसा करने का प्रयास अभी भी अपरिभाषित व्यवहार को जन्म दे सकता है , यदि पढ़ा हुआ मान अमान्य हो जाता है (तथाकथित "ट्रैप प्रतिनिधित्व") उस प्रकार के लिए जिसे इसके माध्यम से पढ़ा जाता है। अन्यथा, पढ़ा गया मान कार्यान्वयन है।
C89 / 90 ने इसे अनिर्दिष्ट व्यवहार (अनुलग्नक J) के तहत बुलाया और K & R की पुस्तक कहती है कि यह कार्यान्वयन परिभाषित है। K & R से उद्धरण:
यह एक संघ का उद्देश्य है - एक एकल चर जो वैध रूप से कई प्रकारों में से किसी एक को पकड़ सकता है। [...] जब तक उपयोग सुसंगत है: जिस प्रकार को पुनर्प्राप्त किया जाना चाहिए वह प्रकार हाल ही में संग्रहीत किया गया है। यह प्रोग्रामर की ज़िम्मेदारी है कि वह इस बात पर नज़र रखे कि एक यूनियन में वर्तमान में किस प्रकार का संग्रह है; यदि कोई चीज़ एक प्रकार के रूप में संग्रहीत की जाती है और दूसरे के रूप में निकाली जाती है तो परिणाम कार्यान्वयन-निर्भर होते हैं।
स्ट्रॉस्ट्रुप की टीसी ++ पीएल (जोर मेरा) से निकालें
डेटा की संगतता के लिए यूनियनों का उपयोग आवश्यक हो सकता है [...] कभी-कभी "टाइप रूपांतरण " के लिए दुरुपयोग किया जाता है ।
इन सबसे ऊपर, यह सवाल (जिसका शीर्षक मेरे पूछने के बाद से अपरिवर्तित रहता है) को यूनियनों के उद्देश्य को समझने के इरादे से पेश किया गया था और न कि मानक क्या अनुमति देता है जैसे कोड पुन: उपयोग के लिए विरासत का उपयोग करना, ज़ाहिर है, सी ++ मानक द्वारा अनुमत है, लेकिन यह C ++ भाषा फीचर के रूप में विरासत को पेश करने का उद्देश्य या मूल उद्देश्य नहीं था । यही कारण है कि एंड्री का जवाब स्वीकृत के रूप में जारी है।
scouring C++11's standard I couldn't conclusively say that it calls out accessing/inspecting a non-active union member is undefined [...] All I could find was §9.5/1
...वास्तव में? आप एक अपवाद नोट को उद्धृत करते हैं , पैराग्राफ की शुरुआत में मुख्य बिंदु सही नहीं है : "एक संघ में, गैर-स्थैतिक डेटा सदस्यों में से अधिकांश किसी भी समय सक्रिय हो सकता है, अर्थात, सबसे अधिक में से एक का मूल्य गैर-स्थैतिक डेटा सदस्यों को किसी भी समय एक संघ में संग्रहीत किया जा सकता है। " - और पी 4 से नीचे: "सामान्य तौर पर, किसी को संघ के सक्रिय सदस्य को बदलने के लिए स्पष्ट विध्वंसक कॉल और प्लेसमेंट नए ऑपरेटरों का उपयोग करना चाहिए "
b, g, r,
औरa
सन्निहित नहीं भी हो सकता है, और इस प्रकार ए के लेआउट से मेल नहीं खाता हैuint32_t
। यह एंडियन के उन मुद्दों के अतिरिक्त है जो दूसरों ने इंगित किए हैं।