दिलचस्प पोस्ट
मैं रेल में कंसोल से नियंत्रक / दृश्य विधियों को कैसे कॉल करूं? एंड्रॉइड में बाहरी सार्वजनिक भंडारण के लिए फाइल कैसे लिखनी है ताकि वे विंडोज से दिख सकें? एसक्यूएल कॉमांड में अर्रे पैरामीटर पास करें रुबी में एरेज़ और हशों का प्रदर्शन IOS में UITextField में पासवर्ड सत्यापन एंड्रॉइड में कस्टम फ़ॉन्ट को थीम में जोड़ना सीचडीबी और काउचबेस के बीच का अंतर PHP का उपयोग करके पूर्ण यूआरएल में रिश्तेदार पथ को ट्रांसफ़ॉर्म करें क्या SQL सर्वर में इंडेक्स और कवर किए गए क्वेरीज़ कवर कर रहे हैं? वेब पेज से दूर नेविगेट करते समय अलर्ट फ़ंक्शन के नाम से एक स्ट्रिंग से एक मॉड्यूल के फ़ंक्शन को कॉल करना पर्यावरण के बीच क्या अंतर है। (और) अनुप्रयोग। शट डाउन ()? आंशिक रूप से योग्य प्रकार के नाम दिए जाने पर कैसे Type.GetType काम करता है? रूबी सेटर और गेस्टेर तरीके सीखने / समझने की कोशिश करना 'लूप के लिए' पायथन में स्क्रॉप करना

सी ++ अनाम स्ट्रैक्ट्स और यूनियनों को अस्वीकार क्यों करता है?

कुछ सी ++ कंपाइलर मानक सी ++ के विस्तार के रूप में अनाम यूनियनों और स्ट्रैक्ट्स को अनुमति देते हैं। यह वाक्यविन्यास चीनी का एक सा है जो कभी-कभी बहुत उपयोगी होता है

क्या तर्क है जो इसे मानक का हिस्सा होने से रोकता है? क्या कोई तकनीकी अवरोध है? एक दार्शनिक एक? या बस इसे पर्याप्त ठहराने की आवश्यकता के लिए पर्याप्त नहीं है?

यहाँ मैं किस बारे में बात कर रहा हूं इसका एक नमूना है:

struct vector3 { union { struct { float x; float y; float z; }; float v[3]; }; }; 

मेरा कंपाइलर इसे स्वीकार करेगा, लेकिन यह चेतावनी देता है कि "अनाम संरचना / संघ" सी ++ के लिए एक गैर मानक एक्सटेंशन है

Solutions Collecting From Web of "सी ++ अनाम स्ट्रैक्ट्स और यूनियनों को अस्वीकार क्यों करता है?"

जैसा कि अन्य ने इंगित किया है कि अज्ञात यूनियनों को मानक C ++ में अनुमति है, लेकिन अनाम स्ट्रेंक्ट्स नहीं हैं।

इसका कारण यह है कि सी गुमनाम यूनियनों का समर्थन करता है, लेकिन अज्ञात स्ट्रक्चियों * नहीं, इसलिए सी ++ अनुकूलता के लिए पूर्व का समर्थन करता है, लेकिन बाद में नहीं है क्योंकि यह संगतता के लिए आवश्यक नहीं है।

इसके अलावा, C ++ में अज्ञात स्ट्रक्चियों के लिए बहुत अधिक उपयोग नहीं है आपके द्वारा प्रदर्शित किए जाने वाले प्रयोग में तीन फ़्लोट्स वाला एक स्ट्रेट है, जिसे या तो .v[i] , या .y , .y , और .z द्वारा संदर्भित किया जा सकता है, मेरा मानना ​​है कि C ++ में अपरिभाषित व्यवहार में परिणाम। सी ++ आपको यूनियन के एक सदस्य को लिखने की अनुमति नहीं देता है, कहते हैं। .v[1] , और उसके बाद दूसरे सदस्य से पढ़ें, कहते हैं। हालांकि ऐसा कोड जो असामान्य नहीं है, यह वास्तव में अच्छी तरह से परिभाषित नहीं है।

उपयोगकर्ता परिभाषित प्रकारों के लिए C ++ की सुविधाएं वैकल्पिक समाधान प्रदान करती हैं उदाहरण के लिए:

 struct vector3 { float v[3]; float &operator[] (int i) { return v[i]; } float &x() { return v[0]; } float &y() { return v[1]; } float &z() { return v[2]; } }; 

* सी 11 जाहिरा तौर पर अनाम स्ट्रैक्ट्स जोड़ता है, इसलिए भविष्य में C ++ में संशोधन उन्हें जोड़ सकते हैं।

मैं कहूंगा, आप एक union का उपयोग करके अपने vector3 घोषणा को साफ कर सकते हैं

 union vector3 { struct { float x, y, z; } ; float v[3] ; } ; 

ज़रूर, अनाम संरचनाएं एक एमएसवीसी एक्सटेंशन थी । लेकिन आईएसओ सी 11 ने इसे अब अनुमति दी है, और जीसीसी इसे अनुमति देता है , और इसलिए ऐप्पल के एलएलवीएम कंपाइलर भी ऐसा करता है।

सी 11 और सी ++ 11 में क्यों नहीं? मुझे यकीन नहीं है, लेकिन अधिकतर व्यावहारिक रूप से बोलने वाले (जीसीसी ++, एमएसवीसी ++ और एप्पल के सी ++ कंपाइलर) सी ++ कंपाइलर्स उनका समर्थन करते हैं।

पक्का नहीं आपका क्या मतलब है। सी ++ स्पेक की धारा 9.5, खंड 2:

फार्म का एक संघ

 union { member-specification } ; 

को एक अज्ञात संघ कहा जाता है; यह अज्ञात प्रकार के एक अनाम वस्तु को परिभाषित करता है

आप इस तरह भी कुछ कर सकते हैं:

 void foo() { typedef struct { // unnamed, is that what you mean by anonymous? int a; char b; } MyStructType; // this is more of a "C" style, but valid C++ nonetheless struct { // an anonymous struct, not even typedef'd double x; double y; } point = { 1.0, 3.4 }; } 

हमेशा बहुत उपयोगी नहीं होता … हालांकि कभी-कभी गंदा मैक्रो परिभाषाओं में उपयोगी होते हैं।

संघ अनाम हो सकते हैं; मानक, 9.5 पैराग्राफ 2 देखें

क्या उद्देश्य आप एक अनाम संरचना या वर्ग को पूरा करने के रूप में देखते हैं? मानक में कुछ क्यों नहीं है, इस बारे में सोचने से पहले, मैं कुछ विचार करना चाहता हूं कि यह क्यों होना चाहिए, और मुझे एक गुमनाम संरचना के लिए उपयोग नहीं दिख रहा है

संपादन, टिप्पणियों, और इस एमएसडीएन लेख के आधार पर: बेनामी संरचनाएं , मैं अनुमान लगाता हूं – यह इनकैप्सुलेशन की अवधारणा के साथ खराब है। मैं एक वर्ग के किसी सदस्य को अपने वर्ग नामस्थान के साथ एक सदस्य को जोड़ने से परे नहीं होने की उम्मीद नहीं करता। इसके अलावा, अज्ञात संरचना में परिवर्तन की अनुमति के बिना मेरी कक्षा को प्रभावित कर सकता है।

तुम्हारा कोड

 union { struct { float x; float y; float z; }; float v[3]; }; 

के समान ही

 union Foo { int; float v[3]; }; 

जो निश्चित रूप से अमान्य है (C99 और पहले) में।

इसका कारण संभवतः पार्सिंग (सी) में है, क्योंकि उस मामले में आपको केवल जांच की ज़रूरत है कि संरचना / संघ इकाई में केवल "घोषणाकर्ता बयान" जैसे हैं

 Type field; 

उस ने कहा, जीसीसी और "अन्य कंपाइलर" एक एक्सटेंशन के रूप में अनाम क्षेत्रों का समर्थन करता है।

संपादित करें: बेनामी स्ट्रैक्ट्स अब आधिकारिक तौर पर सी 11 (§6.7.2.1 / 13) में समर्थित हैं।