2010-11-15 9 views
14

में अज्ञात नेमस्पेस के भीतर प्रतीकों का लिंकेज C++ में, किसी अज्ञात नेमस्पेस में फ़ंक्शन या चर डालने से इसकी लिंक आंतरिक हो जाती है, i। ई। फ़ाइल स्तर पर static घोषित करने के समान, लेकिन idiomatic C++।नियमित नेमस्पेस

सामान्य नामस्थान के भीतर एक अज्ञात नेमस्पेस के बारे में क्या? क्या यह अभी भी आंतरिक संबंध की गारंटी देता है?

// foo.cpp 

void func1() { 
    // external linkage 
} 

static void func2() { 
    // internal linkage 
} 

namespace { 
    void func3() { 
     // internal linkage 
    } 
} 

namespace ns1 { 
    void func4() { 
     // external linkage 
    } 

    namespace { 
     void func3() { 
      // still internal linkage? 
     } 
    } 
} 
+1

गलत धारणा। एक एनीनीमस नेमस्पेस के अंदर चर के बाहरी संबंध होते हैं, जब तक कि 'स्थिर' घोषित न किया जाए। – MSalters

+1

@MSalters: मुझे लगता है कि सी ++ 11 के साथ यह बदल गया है। '§3.5/4: एक अनाम नामस्थान या एक नामांकित नामस्थान के भीतर प्रत्यक्ष या परोक्ष रूप से घोषित एक नामस्थान आंतरिक संबंध है। अन्य सभी नेमस्पेस में बाहरी लिंकेज है। – legends2k

+1

@ legends2k: यह एक और परिवर्तन का हिस्सा है, जिसने उन नामों को टेम्पलेट तर्क के रूप में मान्य किया है (सी ++ 03 में, टेम्पलेट तर्कों को बाहरी लिंकेज की आवश्यकता होती है, जो एक अनाम नामस्थान में परिभाषित स्थिरांक से संतुष्ट था) – MSalters

उत्तर

11

सी ++ 11 (मसौदा N3337) §3.5/4: (जोर मेरा)

एक अनाम नाम स्थान या एक नाम स्थान एक अनाम नाम स्थान के भीतर प्रत्यक्ष या परोक्ष रूप घोषित आंतरिक संबंध है। अन्य सभी नामस्थानों में बाहरी संबंध है। एक नाम होने नाम स्थान गुंजाइश है कि आंतरिक लिंकेज नहीं दिया गया है ऊपर संलग्नित नाम स्थान के रूप में ही कड़ी है अगर यह

का नाम है - एक चर; या

- एक समारोह; या

- एक नामित वर्ग (क्लॉज 9), या एक टाइपेडफ घोषणा में परिभाषित एक अज्ञात वर्ग जिसमें कक्षा के उद्देश्यों के लिए टाइपिफ़ नाम है (7.1.3); या

- एक नामित गणन (7।2), या एक टाइपेडफ घोषणा में परिभाषित एक अनाम गणना जिसमें गणना के उद्देश्यों के लिए टाइपिफ़ नाम है (7.1.3); या

- लिंक के साथ एक गणना से संबंधित एक गणक; या

- एक टेम्पलेट।

यह guarentees किसी भी अज्ञात नाम स्थान आंतरिक संबंध है।

सामान्य नामस्थान के भीतर एक अज्ञात नेमस्पेस के बारे में क्या? क्या यह अभी भी आंतरिक संबंध की गारंटी देता है?

हालांकि एक नामित (सामान्य) नाम स्थान के अंदर, यह एक अनाम (अनाम) नाम स्थान है और इस प्रकार प्रति सी ++ 11 मानक के रूप में आंतरिक संबंध है करने के लिए गारंटी है।


एक गुमनाम नाम स्थान में एक समारोह या एक चर डाल अपने लिंकेज आंतरिक, मैं बना देता है। ई। इसे फ़ाइल-स्तर पर स्थैतिक घोषित करने के समान, लेकिन idiomatic C++।

सी ++ 11 में इस संदर्भ में static के उपयोग undeprecated था; हालांकि unnamed namespace is a superior alternative to static, there're instances where it fails जिसे static द्वारा उपचार किया गया है; इसे संबोधित करने के लिए inline namespace was introduced in C++11

15

यह आवश्यक नहीं है कि अज्ञात नामस्थान में इकाइयों में आंतरिक संबंध हो; वे वास्तव में बाहरी संबंध हो सकता है।

चूंकि अनाम नामस्थान का नाम एक ऐसा नाम है जो अनुवाद इकाई के लिए अद्वितीय है जिसमें इसे संकलित किया गया था, आप उस अनुवाद इकाई के बाहर से घोषित संस्थाओं का उल्लेख नहीं कर सकते हैं, भले ही उनका संबंध क्या है।

सी ++ मानक का कहना है (सी ++ 03 7.3.1.1/note 82):

हालांकि एक अनाम नाम स्थान में संस्थाओं बाहरी संबंध हो सकता है, वे प्रभावी रूप से एक नाम उनके अनुवाद इकाई के लिए अद्वितीय द्वारा योग्य हैं और इसलिए किसी भी अन्य अनुवाद इकाई से कभी नहीं देखा जा सकता है।

+2

एक त्वरित अनुवर्ती: क्या आपको पता है कि किसी भी तरह से आंतरिक संबंध होने से कंपाइलर को अपने अनुकूलन के लिए बेहतर कोड परिवर्तन निर्णय लेने में मदद मिलती है, या यह एक गैर-मुद्दा है? –

+0

@ एलेक्स बी: यह एक अच्छा सवाल है। मेरा अनुमान यह होगा कि यदि एक कंपाइलर या लिंकर आंतरिक संबंधों के साथ इकाइयों पर अनुकूलन कर सकता है, तो वे एक अनाम नामस्थान में इकाइयों पर समान अनुकूलन कर सकते हैं। हालांकि, मैं निश्चित रूप से नहीं कह सकता। यहां अन्य लोग मुझसे ज्यादा बेहतर जानते हैं। –

5

$ 3,5/3 - एक चर, वह यह है कि समारोह या समारोह टेम्पलेट - "एक नाम नाम स्थान गुंजाइश (3.3.6) होने आंतरिक लिंकेज अगर यह

के नाम

है स्पष्ट रूप से स्थिर घोषित, या,

- एक चर कि स्पष्ट रूप से स्थिरांक घोषित किया जाता है और न ही स्पष्ट रूप से निर्वासन घोषित है और न ही पहले से 01 के लिए घोषितबाहरी संबंध; या

- अज्ञात संघ के डेटा सदस्य ।

तो, मुझे संदेह है कि आपके प्रोग्राम में 'func3' और 'func4' नामों में से कोई भी आंतरिक लिंक है। उनके पास बाहरी संबंध है। हालांकि, यह सिर्फ इतना है कि उन्हें जेम्स से उद्धरण के अनुसार अन्य अनुवाद इकाइयों से संदर्भित नहीं किया जा सकता है।

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