2011-11-27 15 views
22

में नेस्टेड संरचनाएं सी में संरचना के बाहर नेस्टेड संरचनाओं की दृश्यता की अनुमति देने के पीछे कोई महत्व नहीं है लेकिन सी ++ में नहीं? मुझे कोई संदर्भ या प्रासंगिकता नहीं मिली।सी और सी ++

struct a 
{ 
    struct b{ 
    }; 
}; 

int main(){ 
    struct b var; // allowed in C not in C++. 
} 
+2

सी ++ में आप 'a :: b var;' –

+0

का उपयोग करेंगे किसी भी तरह से मुझे कभी एहसास नहीं हुआ कि कोई अंतर था ... – Mehrdad

+2

वें नहीं था ई ऑपरेटर :: विभिन्न क्षेत्रों के बहुत से विचार के साथ केवल सी ++ में पेश किया गया? – Kos

उत्तर

4

क्योंकि ख गुंजाइश एक के अंदर है, आप के बजाय struct a::b उपयोग करने के लिए (और सी में विपरीत, struct कीवर्ड वैकल्पिक है)।

32

यह सी में मान्य है क्योंकि सी में एक एकल नामस्थान है जिसमें सभी nonlocal प्रकार (यानी, कार्यों में घोषित प्रकारों को परिभाषित नहीं किया गया है); नामस्थान या घोंसले का उपयोग कर प्रकारों की कोई गुंजाइश नहीं है।

सी ++ में, b टाइप करें a वर्ग के सदस्य के रूप में घोंसला है, इसलिए इसका नाम उस दायरे से योग्य होना चाहिए जिसमें इसे घोषित किया गया है।

+0

@ जिमबाल्टर धन्यवाद; तय की। –

+0

क्या सी में स्केलर प्रकार के नामों और structs या ऐसा कुछ के लिए दो अलग-अलग वैश्विक नामस्थान नहीं हैं? –

+1

@ केरेकस्क: हाँ, एक अर्थ में। प्रश्न में नामस्थान टैग नामस्थान है ('struct a {}; 'में, टैग' a' है)। –

8

मुझे विश्वास है कि संरचना के बाहर नेस्टेड संरचनाओं को संदर्भित करने की क्षमता डेटा छिपाने में सुधार के लिए सी ++ में हटा दी गई थी। यदि आपको बाहरी रूप से घोंसला वाली संरचना तक पहुंचने की आवश्यकता है, तो शायद यह पहले स्थान पर घोंसला वाली संरचना नहीं होनी चाहिए।

विकिपीडिया कहता है: "सी और सी ++ दोनों में नेस्टेड संरचना प्रकार परिभाषित कर सकते हैं, लेकिन दायरे को अलग-अलग व्याख्या किया जाता है (सी ++ में, एक नेस्टेड संरचना केवल बाहरी संरचना के दायरे/नामस्थान के भीतर परिभाषित की जाती है)।" (http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B)। यह क्यों नहीं कहता है, लेकिन कम से कम यह अंतर को स्वीकार करता है।

हालांकि, आप संरचना तक पहुंचने के लिए नेमस्पेस रिज़ॉल्यूशन ऑपरेटर का उपयोग कर सकते हैं।

+2

* क्यों * नामस्थान प्रदूषण से परहेज कर रहा है। Http://www2.research.att.com/~bs/sibling_rivalry.pdf से: "सी में, संरचना स्कोप जो घोंसला दिखाई देते हैं, वे नहीं हैं, क्योंकि अंदर घोषित संरचना नाम बाहरी दायरे में माना जाता है। सी ++ में अप्रबंधनीय साबित हुआ जहां नेस्टेड कक्षाएं अक्सर कार्यान्वयन विवरण के रूप में उपयोग की जाती थीं। परिणामस्वरूप, सी ++ नेस्टेड संरचना के क्षेत्र को अपनाया। " – UncleBens

+0

हाँ जो समझ में आता है, धन्यवाद। –

+0

+1 "शायद पहले स्थान पर एक नेस्टेड संरचना नहीं होनी चाहिए"। – mskfisher

2

आप C++ एक गुंजाइश अपने उदाहरण struct ख में बिना कुछ भी की घोषणा नहीं कर सकते हैं struct एक अंदर निहित है, संकलक जहां struct ख को खोजने के लिए

आप

struct a :: b var; 
उपयोग करने के लिए पता नहीं है

सी में दायरे के लिए कोई प्रतिबंध नहीं है, लेकिन सी ++ एक प्रतिबंध सुनिश्चित करता है