आप सी 11 के साथ कर सकते हैं:
§ 6.7.2.1 - 11
एक अनाम सदस्य जिसका प्रकार निर्दिष्टकर्ता कोई टैग के साथ एक संरचना विनिर्देशक एक गुमनाम संरचना कहा जाता है; एक अज्ञात सदस्य जिसका टाइप विनिर्देश के साथ यूनियन विनिर्देशक है, किसी टैग को अनाम संघ कहा जाता है। अज्ञात संरचना या संघ के सदस्यों को युक्त संरचना या संघ के सदस्य माना जाता है। यह को पुनरावर्ती रूप से लागू करता है यदि युक्त संरचना या संघ भी अज्ञात है।
तो यह कोड पराक्रम काम:
#include <stdio.h>
typedef struct { int x; } foo;
typedef struct { foo; } bar;
int main(void)
{
bar b;
b.x = 1;
printf("%d\n", b.x);
}
समस्या यहां है कि विभिन्न compilers पर कि क्या एक typedef कोई टैग के साथ एक struct विनिर्देशक के रूप में स्वीकार्य है मेरी परीक्षणों में सहमत नहीं है मानक निर्दिष्ट करता है:
§ 6.7।8 - 3
एक घोषणा जिसका भंडारण-वर्ग विनिर्देशक typedef
है, प्रत्येक declarator एक पहचानकर्ता को परिभाषित करता है एक typedef नाम उस प्रकार रास्ते में पहचानकर्ता के लिए निर्दिष्ट 6.7.6 में वर्णित अर्थ है होना करने के लिए । [...] ए typedef
घोषणा एक नए प्रकार का परिचय नहीं देती है, केवल निर्दिष्ट प्रकार के लिए समानार्थी शब्द।
(जोर मेरा) - लेकिन पर्याय भी एक typdef नाम विनिर्देशक मतलब है एक struct विनिर्देशक के लिए विनिमय है? gcc
इसे स्वीकार करता है, clang
नहीं करता है।
बेशक
, वहाँ इन घोषणाओं के साथ प्रकार foo
के पूरे सदस्य व्यक्त करने के लिए, आप अपने नामित सदस्य f
बलिदान कोई रास्ता नहीं है।
नाम टकराव के बारे में अपने संदेह के संबंध में, इस gcc
क्या कहना है जब आप किसी अन्य int x
bar
अंदर डाल दिया है: अस्पष्टता
structinherit.c:4:27: error: duplicate member 'x'
typedef struct { foo; int x; } bar;
^
बचने के लिए आप के रूप में सिर्फ दोहराने struct, संभवतः #define
घ कर सकते हैं
#include <stdio.h>
typedef struct { int x; } foo;
typedef struct { struct { int x; }; } bar;
int main(void)
{
bar b;
b.x = 1;
printf("%d\n", b.x);
}
लेकिन किसी भी अनुरूप संकलक: किसी मैक्रो, लेकिन निश्चित रूप से, यह एक बिट बदसूरत लग रहा है इस कोड को स्वीकार करना चाहिए, इसलिए इस संस्करण से चिपके रहें।
< राय > यह एक दया है, मैं वाक्य रचना gcc
से काफी बेहतर स्वीकार किए जाते हैं, लेकिन मानक के शब्द के रूप में यह स्पष्ट इस अनुमति देने के लिए नहीं है, केवल सुरक्षित शर्त ग्रहण करने के लिए है यह वर्जित है, तो clang
यहां इसके लिए जिम्मेदार नहीं है ... </राय >
आप द्वारा x
का उल्लेख करना चाहते हैं या तोb.x
याb.f.x
, आप इस तरह एक अतिरिक्त गुमनाम संघ का उपयोग कर सकते हैं:
#include <stdio.h>
typedef struct { int x; } foo;
typedef struct {
union { struct { int x; }; foo f; };
} bar;
int main(void)
{
bar b;
b.f.x = 2;
b.x = 1;
printf("%d\n", b.f.x); // <-- guaranteed to print 1
}
यह
§ की वजह से नहीं कारण अलियासिंग मुद्दों 6.5.2.3 जाएगा - 6
एक विशेष गारंटी किया जाता है यूनियनों के उपयोग को सरल बनाने के लिए: यदि एक संघ में कई संरचनाएं होती हैं जो एक सामान्य प्रारंभिक अनुक्रम साझा करती हैं (नीचे देखें), और यदि यूनियन ऑब्जेक्ट में वर्तमान में इनमें से एक संरचना है, तो इसे इंसप करने की अनुमति है उनमें से किसी भी के सामान्य प्रारंभिक भाग को कहीं भी प्राप्त करें कि संघ के पूर्ण प्रकार की घोषणा दिखाई दे रही है।दो संरचनाएं एक प्रारंभिक अनुक्रम साझा करती हैं यदि संबंधित सदस्यों में एक या अधिक प्रारंभिक सदस्यों के अनुक्रम के लिए संगत प्रकार (और, बिट-फ़ील्ड, समान चौड़ाई के लिए)
शानदार प्रतिक्रिया। यह वास्तव में सवाल का जवाब देता है। बेनामी संरचनाएं जो मैं खोज रहा था, और यह बहुत संभव है कि मैं सी ++ 11 विशिष्ट कोड में देख रहा था। – Stewart
@ स्टीवर्ट सी 11, ** ** ** सी ++ 11 के बारे में मेरी पूरी प्रतिक्रिया वार्ता नोट करें। मुझे नहीं पता कि यह सी ++ 11 पर भी लागू है या नहीं। –