C ++ में स्थिर ग्लोबल्स और अनाम नामस्थान


11
  1. C ++ ने अनाम नामस्थान (बाहरी लिंकेज) में स्थिर ग्लोबल्स (आंतरिक लिंकेज) और प्रतीकों के बीच कोई अंतर क्यों किया, लेकिन बाद का परिचय देते समय इसे बाहर से संदर्भित करने का कोई तरीका नहीं है)?

  2. क्या उनमें से कोई कारण अभी भी मान्य हैं, या नए हैं?

  3. क्या ऐसी कोई जगह बची है, जहाँ वे अभी भी अलग हैं लेकिन मनमाना नियम है कि अनाम वैश्विक (या नाम स्थान-क्षेत्र) यूनियनों को होना चाहिएstatic , और वे क्या हैं?

  4. बोनस-अंकों के लिए, यदि उनके अलग होने के लिए कोई अच्छा कारण नहीं बचा है, तो क्या उन्हें समतुल्य बनाने का अनुरोध है?


जब C ++ ने नामस्थान (C ++ 98), और विशेष रूप से अनाम नामस्थानों को पेश किया, तो स्थैतिक ग्लोबल्स को उत्साह की एक लड़ाई में नई चीज़ के रूप में अप्रचलित और हीन के रूप में पदावनत किया गया, हालांकि यह ++ 11 के साथ वापस आ गया था :
स्थैतिक कीवर्ड की अवहेलना ... अब और नहीं?

C ++ 11 से पहले, आंतरिक लिंकेज वाले प्रतीकों को टेम्पलेट-तर्क के रूप में उपयोग नहीं किया जा सकता है: C ++ 03 को टेम्पलेट लिंकेज की आवश्यकता क्यों थी?


ऐसा लगता है कि आपने "अनुरूप कार्यान्वयन" बिट को छोड़कर, ज्यादातर अपने स्वयं के प्रश्न का उत्तर दिया है; शायद आपको दूसरी छमाही को हटाने और इसके जवाब के रूप में पोस्ट करने पर विचार करना चाहिए? या यहाँ अभी भी कुछ अनुत्तरित है?
काइल स्ट्रैंड

@KyleStrand ने यह सब सुधार दिया।
डेडुप्लिकेटर

जवाबों:


3

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

अनुकरणीय, निम्नलिखित कोड को ठीक संकलित करना चाहिए। (वास्तव में उपयोगी नहीं है, क्योंकि आप दोनों प्रकारों के बीच अंतर नहीं कर सकते, लेकिन अनुमति दी गई है)

#include <iostream>

struct Foobar
{
    int   foo;
    float bar;
};

namespace
{

struct Foobar
{
    double baz;
};

} // namespace

int main()
{
    std::cout << "HELLO!\n";
}

यहां एक जीवित परीक्षण


यह संकलन करता है क्योंकि आप मुख्य फ़ंक्शन में फ़ॉबर का उपयोग नहीं करते हैं।
dshil

अधिक महत्वपूर्ण बात यह है कि यदि कोई अन्य .cpp फ़ाइल अपने स्वयं के संस्करण की घोषणा करती है तो क्या होगा struct Foobar? इससे भी बदतर, मान लीजिए कि यह अब है class Foobar। इस बारे में सोचें कि आप दोनों के लिए निर्माण करने की योजना कैसे बनाते हैं।
1919
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.