दिलचस्प पोस्ट
क्या कोई वस्तु प्रारंभकर्ता का उपयोग करने का कोई लाभ है? डीजेंगो वनटॉइनफिल्ड और विदेशी के बीच अंतर क्या है? इंटरफ़ेस बिल्डर के साथ बनाई गई किसी निब फ़ाइल का उपयोग करके UIView को कैसे लोड करें सी # में ओवरराइड और नए कीवर्ड के बीच क्या फर्क है? दशमलव चिह्न परिवर्तित करें जावास्क्रिप्ट तत्व मूल्य प्राप्त करें विशिष्ट फ़ील्ड वैल्यू के अनुसार पहले क्रम देना आवेदन को बढ़ाया यूएसी दे रहा है एंड्रॉइड: अनुमति अस्वीकृति: निरस्त अनुमति के साथ शुरूआती इरादा android.permission.CAMERA आर में सफेद स्थान के पहले वर्ण स्ट्रिंग निकालने के लिए gsub का उपयोग करना कैसे srand रैंड समारोह से संबंधित है? क्या वेब ब्राउज़र हमेशा एक डोमेन नाम के बाद एक अनुगामी स्लैश भेजते हैं? फाईल को एक रिकॉर्ड के रूप में हाउप में पढ़ना क्या एसटीएल कंटेनर एडाप्टर के अंतर्निहित कंटेनर तक पहुंचने का कोई तरीका है? Google मानचित्र एपीआई – सड़क निर्देशांक प्राप्त करना

C99 में संरचना के भीतर अज्ञात संघ?

यहां मेरे पास समस्या का कोड बहुत सरल है:

 एन्यूम नोड_प्रकार {
     t_int, t_double
 };

 struct int_node {
     आंत मूल्य;
 };

 struct double_node {
     डबल वैल्यू;
 };

 संरचना नोड {
     एन्यूम नोड_प्रकार प्रकार;
     संघ { 
          struct int_node int_n; 
          संरचना डबल_एनोड डबल_एन; 
      };
 };

 int मुख्य (शून्य) {
     struct int_node i;
     i.value = 10;
     संरचना नोड n;
     ntyty = t_int;
     एन।  int_n = i;
     वापसी 0;
 }

और जो मैं नीचे नहीं करता वह यह है:

 $ cc us.c 
 $ cc -std = c99 us.c 
 us.c: 18: 4: चेतावनी: घोषणा कुछ भी नहीं घोषित करता है
 us.c: फ़ंक्शन 'मुख्य' में:
 us.c: 26: 4: त्रुटि: 'स्ट्रक्चर नोड' का कोई सदस्य नहीं है 'int_n'

GCC बिना -std विकल्प के बिना किसी भी समस्या के ऊपर कोड संकलित किया जाता है (और समान कोड बहुत अच्छी तरह से काम कर रहा है), लेकिन ऐसा लगता है कि c99 इस तकनीक की अनुमति नहीं देता है। ऐसा क्यों है और यह संभव है c99 (या c89 , c89 ) संगत? धन्यवाद।

Solutions Collecting From Web of "C99 में संरचना के भीतर अज्ञात संघ?"

अनाम यूनियनें एक जीएनयू एक्सटेंशन हैं, सी भाषा के किसी भी मानक संस्करण का हिस्सा नहीं हैं आप -std = gnu99 या c99 + GNU एक्सटेंशन के लिए ऐसा कुछ उपयोग कर सकते हैं, लेकिन उचित सी लिखना सबसे अच्छा है और ऐसे एक्सटेंशन पर निर्भर नहीं हैं जो वाक्यात्मक चीनी प्रदान करते हैं …

संपादित करें: C11 में अनाम यूनियनों को जोड़ा गया था, इसलिए वे अब भाषा का एक मानक हिस्सा हैं। संभवतः जीसीसी की -std=c11 आपको उनको इस्तेमाल करने देता है।

मुझे यह सवाल एक और एक साढ़े के बारे में बाकी सब के बाद मिल रहा है, इसलिए मैं एक अलग जवाब दे सकता हूं: अज्ञात structs C99 मानक में नहीं हैं, लेकिन वे C11 मानक में हैं जीसीसी और कलंक पहले से ही इसका समर्थन करते हैं (सी -111 मानक ने माइक्रोसॉफ्ट से इस सुविधा को उठा लिया है, और जीसीसी ने कुछ समय के लिए कुछ एमएसएफटी एक्सटेंशन के लिए समर्थन प्रदान किया है)।

खैर, इसका समाधान संघ के नाम का नाम देना था (जो डेटाटाइप के रूप में गुमनाम रह सकता है) और उसके बाद उस नाम को प्रॉक्सी के रूप में प्रयोग किया जाता है।

 $ diff -u old_us.c us.c 
 --- पुराने_स.स. 2010-07-12 13: 49: 25.000000000 +0200
 +++ us.c 2010-07-12 13: 49: 02.000000000 +0200
 @@ -15,7 +15,7 @@
    संघ {
      struct int_node int_n;
      संरचना डबल_एनोड डबल_एन;
 -};
 +} डेटा;
  };

  int मुख्य (शून्य) {
 @@ -23,6 +23,6 @@
    i.value = 10;
    संरचना नोड n;
    ntyty = t_int;
 - n.int_n = i;
 + n.data.int_n = i;
    वापसी 0;
  }

अब यह किसी भी समस्याओं के बिना c99 रूप में संकलित है

 $ cc -std = c99 us.c 
 $ 

नोट: मैं इस समाधान के बारे में भी खुश नहीं हूं।

संघ का एक नाम होना चाहिए और इसे इस तरह घोषित किया जाना चाहिए:

 union UPair { struct int_node int_n; struct double_node double_n; }; UPair X; X.int_n.value = 12; 

एक अन्य समाधान है कि हर enum node_type type में सामान्य हैडर वैल्यू ( enum node_type type ) enum node_type type और अपने शीर्ष-स्तरीय संरचना को एक यूनियन बनाना। यह वास्तव में "खुद को दोहराएं" नहीं है, लेकिन यह अज्ञात यूनियनों और असुविधाजनक दिखने वाले प्रॉक्सी मूल्यों से बचने के लिए नहीं है।

 enum node_type { t_int, t_double }; struct int_node { enum node_type type; int value; }; struct double_node { enum node_type type; double value; }; union node { enum node_type type; struct int_node int_n; struct double_node double_n; }; int main(void) { union node n; n.type = t_int; // or n.int_n.type = t_int; n.int_n.value = 10; return 0; } 

C99 6.2.7.1 को देखते हुए, मैं देख रहा हूँ कि पहचानकर्ता वैकल्पिक है:

  struct-or-union-specifier: struct-or-union identifier-opt { struct-declaration-list } struct-or-union identifier struct-or-union: struct union struct-declaration-list: struct-declaration struct-declaration-list struct-declaration struct-declaration: specifier-qualifier-list struct-declarator-list ; specifier-qualifier-list: type-specifier specifier-qualifier-list-opt type-qualifier specifier-qualifier-list-opt 

मैं ऊपर और नीचे खोज कर रहा हूं, और अज्ञात यूनियनों के बारे में कल्पना के खिलाफ कोई संदर्भ नहीं मिल सकता है। संपूर्ण -प्रॉप प्रत्यय इंगित करता है कि बात, इस मामले में identifier 6.1 के अनुसार वैकल्पिक है।