2010-11-02 9 views
6

C++ 0x draftग्लोबल अनाम यूनियनों को स्थैतिक घोषित करने की आवश्यकता क्यों है?

9.5.6 बेनामी यूनियनों नाम नाम स्थान में या वैश्विक नाम स्थान में घोषित स्थिर घोषित किया जाएगा।

क्यों?


Update-

बार्ट वैन इन्जेन Schenau और लोथर के respones के आधार पर, सबसे अच्छा विवरण अब तक इस हो सकता है:

ही वैश्विक गुमनाम संघ दो अनुवाद इकाइयों में सामना करना पड़ा है, तो (जैसे कि , एक हेडर फ़ाइल के माध्यम से), तो एक परिभाषा नियम कैसे संतुष्ट हो सकता है? क्या दो परिभाषाओं को एक जैसा माना जाता है और एक साथ विलय किया जाता है? या दो परिभाषाओं को अलग-अलग माना जाता है? यदि उन्हें समान माना जाता है, तो संकलक संभवतः 'जादू' कर रहा है जो अन्यथा अन्य संस्थाओं के लिए नहीं करता है। यदि उन्हें समान माना जाता है, तो संकलक प्रोग्रामर की स्पष्ट सहमति के बिना ऐसा कर रहा है ... इसलिए मुझे लगता है कि इसे स्पष्ट सहमति के रूप में घोषित करने के लिए स्पष्ट सहमति को मजबूर किया जा रहा है।

उत्तर

1

मेरा अनुमान है कि यह यह उल्लंघन हो सकता है ODR (one definition rule)

+0

यह प्लस बार्ट वैन इंजेन शेंगेऊ की प्रतिक्रिया एक साथ अब तक का सबसे अच्छा स्पष्टीकरण हो सकता है। – Vatsan

1

मेरे सर्वोत्तम अनुमान:

यदि यह गैर स्थिर थे, यह अन्य कोड से संदर्भित किया जा सकता है। लेकिन अन्य कोड इसे क्या कहेंगे? यह अज्ञात है। इसलिए, किसी अज्ञात संघ को कुछ स्थानीय दायरे में सीमित करने की आवश्यकता; इसलिए, इसे स्थिर घोषित किया जाएगा।

लेकिन यह सिर्फ एक अनुमान है। भाषा डिजाइनर चीजों को जिस तरह से चाहते हैं उन्हें डिजाइन करने के लिए मिलता है। कभी-कभी उनके विकल्प मनमानी होते हैं, सिर्फ इसलिए कि कुछ पसंद किया जाना चाहिए।

+0

मुझे नहीं लगता कि कोड के एक अलग हिस्से में इसे क्या कहा जाता है, यह समस्या हो सकती है - क्योंकि इसे कुछ भी नहीं कहा जाता है। इसके बजाय, केवल सदस्यों को सीधे संदर्भित किया जाता है, और उनके सभी के नाम हैं। यह संघ स्वयं ही है, न कि इसके सदस्य। – Vatsan

+0

मुझे लगता है कि मैं अंतर्दृष्टि प्राप्त करने की कोशिश कर रहा हूं कि यह सुविधा इस तरह से डिज़ाइन की गई है। बीटीडब्ल्यू यह व्यवहार सी ++ 0x के लिए नया नहीं है (भले ही मैंने सी ++ 0 एक्स ड्राफ्ट उद्धृत किया हो) - यह थोड़ी देर के लिए इस तरह से किया गया है। – Vatsan

0

$ 9.5/5- फॉर्म यूनियन का एक संघ { सदस्य-विनिर्देश}; अज्ञात संघ कहा जाता है; यह अनाम नाम की एक अज्ञात वस्तु को परिभाषित करता है।

मेरा अनुमान है कि यह स्थैतिक होना चाहिए ताकि ऑब्जेक्ट को वैश्विक स्थैतिक वस्तुओं के नियम के अनुसार शुरू किया जा सके। यदि यह स्थिर नहीं है और ऑब्जेक्ट का नाम नहीं है, तो कोई इसे कैसे प्रारंभ करता है?

EDIT2:

पुनर्विचार पर ...

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

+0

लानत! मुझे नहीं पता कि उस डबल 'परिभाषित' से छुटकारा पाने के लिए कैसे – Chubsdad

+0

इसे स्थिर बनाना इसे 'शून्य प्रारंभिक' प्रदान करेगा। लेकिन डिफ़ॉल्ट (शून्य) प्रारंभिक आवश्यकता क्यों है? इसके सदस्यों को उनके नाम से संदर्भित किया जा सकता है, इसलिए पहली बार एनन-यूनियन के एक सदस्य को एक मूल्य सौंपा गया है, तो एनन-यूनियन शुरू किया जाएगा। मैं क्या खो रहा हूँ? – Vatsan

+0

@ वत्सन माधवन: असाइनमेंट प्रारंभिक से अलग है – Chubsdad

4

मान लीजिए गुमनाम यूनियनों स्थिर घोषित किए जाने की आवश्यकता नहीं कर रहे थे एक गैर स्थिर तरह से संघ को परिभाषित करने की अनुमति दी गई है, और संकलक इन दो अनुवाद इकाइयों का सामना करना पड़ता है, तो (पूर्व प्रसंस्करण के बाद):

File1:

union { 
    int a; 
    char b; 
}; 

// Further contents referring to a and b 

File2:

union { 
    int a; 
    char b; 
}; 

// Further (different) contents referring to a and b 

क्या वे दो यूनियन एक ही वस्तु हैं, या क्या वे अलग-अलग वस्तुएं हैं?

मुझे लगता है कि, इस तरह के असंभव प्रश्नों से बचने के लिए, यह निर्णय लिया गया है कि नेमस्पेस-स्कोप अज्ञात यूनियनों को स्थैतिक घोषित किया जाना है।

+0

मुझे लगता है कि, लोथर के ओडीआर प्रतिक्रिया के संयोजन में, अब तक का सबसे अच्छा स्पष्टीकरण हो सकता है। – Vatsan

-1

स्थिर आवश्यकता के लिए कभी औचित्य नहीं था और इसे हटा दिया जाना चाहिए। कंपाइलर यूनियन में कई तत्वों को एक ही पते को साझा करने वाले कई व्यक्तिगत वैश्विक चर के रूप में करता है, और चाहिए। व्यावहारिकता में इसका मतलब है कि संकलक एक ही पते पर कई प्रकारों को लागू करने की अनुमति देता है। चूंकि वैश्विक अज्ञात संघ का दायरा वैश्विक दायरा है, इसलिए अनाम यूनियनों में तत्वों का नामकरण करने के नियम वैश्विक चर नामकरण के नियमों के समान (और हैं) होना चाहिए। यानी अनाम संघ तत्वों के नाम अद्वितीय होना चाहिए। संघ की शुरुआत के लिए - संघ के प्रारंभिक और सरल चर के बीच कोई अंतर नहीं है। स्थिर संघों के बारे में एक और बिंदु - एक संघ का मूल्य और प्रकार समय-निर्भर है। ध्यान दें कि एक समय में केवल एक ही मूल्य एक संघ पर कब्जा कर सकता है चाहे इसमें तत्वों की संख्या हो। शुरू करने के लिए संघ घोषित करने का कारण अलग-अलग प्रकारों, गतिशील रूप से, अलग-अलग समय के लिए उसी पते को उपयोग करने की अनुमति देना है। यही कारण है कि एक स्थिर संघ एक गलत नामक है और कुछ कंपाइलर्स बस इसे अनदेखा करते हैं।

संबंधित मुद्दे