दिलचस्प पोस्ट
स्क्रीन एंड्रॉइड पर डायलॉग की स्थिति बदल रही है सेलेनियम का उपयोग कर ब्राउज़र प्रमाणीकरण को संभालना AttributeError: 'मॉड्यूल' ऑब्जेक्ट में कोई विशेषता नहीं है 'urlopen' फ़ंक्शन पॉइंटर को अन्य प्रकार से कास्ट करना कैसे PHP में सरणी से अल्पविराम से अलग सूची बनाने के लिए? स्ट्रिंग्स का सामान्य उपसर्ग ढूंढें अर्रे (लेन) प्रारंभकर्ता में अपरिभाषित मान रेज़र व्यू इंजन: एक अभिव्यक्ति के पेड़ में एक गतिशील ऑपरेशन नहीं हो सकता है क्यों नहीं काम करती है, लेकिन दूसरों में काम करती है? लोकेल प्रोग्रामेटिक रूप से सेट करें जावा: मैं एक सामान्य प्रकार से कक्षा कैसे प्राप्त करूं? सही सिंगलटन पैटर्न उद्देश्य सी (आईओएस)? IPhone5 पर लॉन्च स्क्रीन पर काले सलाखों (और iPhone6) रोटेशन एंड्रॉइड पर गतिविधि पुनः आरंभ Codeigniter एकाधिक फ़ाइल अपलोड messes फ़ाइल एक्सटेंशन

ग्लोबल स्कोप बनाम ग्लोबल नेमस्पेस

मैंने इन दो वाक्यांशों के उपयोगों को देखा: वैश्विक क्षेत्र और वैश्विक नामस्थान उनके बीच क्या अंतर है?

वेब के समाधान से एकत्रित समाधान "ग्लोबल स्कोप बनाम ग्लोबल नेमस्पेस"

सी ++ में, प्रत्येक नाम का दायरा इसके बाहर होता है, जो इसे मौजूद नहीं है। एक गुंजाइश को कई तरह से परिभाषित किया जा सकता है: इसे नामस्थान , कार्य , वर्ग और बस {} से परिभाषित किया जा सकता है।

तो एक नामस्थान, वैश्विक या अन्यथा, एक क्षेत्र को परिभाषित करता है वैश्विक नामस्थान :: का उपयोग करने के लिए संदर्भित करता है, और इस नाम स्थान में परिभाषित प्रतीकों को वैश्विक क्षेत्र कहा जाता है एक प्रतीक, डिफ़ॉल्ट रूप से, एक वैश्विक नाम स्थान में मौजूद है, जब तक कि किसी ब्लॉक के अंदर परिभाषित नहीं किया जाता है, वह कीवर्ड namespace साथ शुरू होता है, या यह किसी वर्ग के सदस्य या किसी फ़ंक्शन का स्थानीय चर है:

 int a; //this a is defined in global namespace //which means, its scope is global. It exists everywhere. namespace N { int a; //it is defined in a non-global namespace called `N` //outside N it doesn't exist. } void f() { int a; //its scope is the function itself. //outside the function, a doesn't exist. { int a; //the curly braces defines this a's scope! } } class A { int a; //its scope is the class itself. //outside A, it doesn't exist. }; 

यह भी ध्यान रखें कि नाम किसी भी नाम स्थान, कार्य या कक्षा द्वारा परिभाषित आंतरिक गुंजाइश से छिपाया जा सकता है। इसलिए नाम के अंदर नाम स्थान N ने वैश्विक नामशः में नाम छिपा दिया है। उसी तरह, फ़ंक्शन और क्लास में नाम वैश्विक नामस्थान में नाम छिपाते हैं। यदि आपको ऐसी स्थिति का सामना करना पड़ता है, तो आप उपयोग कर सकते हैं ::a वैश्विक नामस्थान में परिभाषित नाम का संदर्भ लें:

 int a = 10; namespace N { int a = 100; void f() { int a = 1000; std::cout << a << std::endl; //prints 1000 std::cout << N::a << std::endl; //prints 100 std::cout << ::a << std::endl; //prints 10 } } 

"स्कोप" "नेमस्पेस" की तुलना में अधिक सामान्य शब्द है प्रत्येक नेमस्पेस, क्लास और कोड ब्लॉक एक दायरे को परिभाषित करता है जिसमें उसमें घोषित नाम उपयोग किया जा सकता है; नामस्थान कक्षाओं और कार्यों के बाहर घोषित नाम के लिए एक कंटेनर है

"ग्लोबल स्कोप" और "ग्लोबल नेमस्पेस" का उपयोग कम या ज्यादा कम किया जा सकता है; एक नेमस्पेस में घोषित नाम की गुंजाइश पूरे नेमस्पेस को कवर करती है। यदि आप विशेष रूप से नाम स्थान और "दायरे" का संदर्भ दे रहे हैं तो "नामस्थान" का उपयोग करें यदि आप इसके अंदर नाम की दृश्यता का संदर्भ दे रहे हैं

स्कोप एक वस्तु के जीवनकाल को दर्शाता है, आपके पास एक वैश्विक चर हो सकता है जो आपके प्रोग्राम के कार्यान्वयन के समय तक मौजूद हो, या आपके पास एक ब्लॉक स्कोप के साथ एक वैरिएबल हो सकता है जो कोड निष्पादित होने तक उस ब्लॉक के अस्तित्व में रहेगा। इस उदाहरण पर विचार करें:

 #include <iostream> int a = 100; main () { int a = 200; std::cout << "local a is: " << a << std::endl; std::cout << "global a is: " << ::a << std::endl; return 0; } 

जब कथन निष्पादित किया जाता है तो local a is: 200 प्रिंट होगा local a is: 200 , जो स्पष्ट रूप से अपेक्षित है, क्योंकि हम a main फिर से परिभाषित कर रहे हैं जो ब्लॉक को संलग्न करने के दायरे में छोड़ देता है। हम ग्लोबल ::a प्रिंट भी प्रिंट करते हैं जो कि फिर से अपेक्षित मूल्य 100 प्रिंट करता है, क्योंकि हमने वैश्विक नामस्थान ::

एक नेमस्पेस सिमेंटिक ज्यादातर तर्कसंगत हैं, यह एक दूसरे से symblos को अलग करने का एक तरीका है, नाम संघर्ष से बचने की आशा में, यह किसी वस्तु के जीवन काल को प्रभावित नहीं करता है।

दूसरी तरफ, एक वस्तु के जीवन काल को दर्शाता है, जो वैश्विक रूप से पहले एक अस्तित्व में उभरा a क्योंकि यह मुख्य रूप से बहुत पहले निर्मित हो जाता है, उसे निष्पादित किया जाता है। हालांकि, गुंजाइश भी प्रतीक पर एक नेमस्पेस को मजबूर करती है, लेकिन उसी तरह नहीं कि एक namespace करता है। विभिन्न प्रकार के स्कोप, global , class , function , block , file आदि हैं …

भ्रामक हिस्सा यह है कि किसी विशेष प्रतीक की दृश्यता को प्रदर्शित करने के लिए कभी-कभी गुंजाइश अतिभारित होती है, जो सी से उधार ली जाती है, जहां नाम स्थान की धारणा मौजूद नहीं थी और दोनों का उपयोग, जीवन काल और दृश्यता को दर्शाने के लिए किया गया था। सी ++ में, हालांकि नियम थोड़ा बदल गया है, लेकिन शब्द का दायरा अभी भी उसी तरह प्रयोग किया जाता है क्योंकि दोनों भाषाओं में बहुत सारी अवधारणाएं हैं

@ मिधिरी रायजोव

विषय थोड़ी सी पुरानी है लेकिन मैं इस बारे में मेरी मदद करना चाहता हूं मुझे लगता है कि आपको चीजों की तुलना में अधिक जटिल नहीं करना चाहिए, वास्तव में वे हैं। एक पहचानकर्ता का Scope एक कंप्यूटर प्रोग्राम का हिस्सा है, जहां पहचानकर्ता, एक नाम जो प्रोग्राम में कुछ इकाई को संदर्भित करता है, को संदर्भित इकाई खोजने के लिए उपयोग किया जा सकता है। इसलिए शब्द का दायरा केवल पहचानकर्ता पर लागू होता है और हमें इसे वस्तु के जीवनकाल के साथ मिश्रण नहीं करना चाहिए। वे कुछ हद तक जुड़े हुए हैं लेकिन मिश्रित नहीं होना चाहिए। ऑब्जेक्ट का जीवनकाल यह दर्शाता है कि हम उस वस्तु के लिए स्मृति को आवंटित करते हैं। इसलिए, उदाहरण के लिए, यदि मेमोरी को स्टैक पर आवंटित किया जाता है, तो फ़ंक्शन खत्म होने पर इसे मुक्त कर दिया जाएगा। इसलिए यह इस बात पर निर्भर करता है कि हम ऑब्जेक्ट को किस स्थान पर संग्रहीत करते हैं और यह उसके जीवनकाल को दर्शाता है। गुंजाइश केवल कहते हैं: "यहां किसी वस्तु का नाम है और हम उस वस्तु का उपयोग उस समय तक और तब तक कर सकते हैं"। इसलिए, जैसा कि मैंने कहा, शब्द का scope केवल वस्तुओं के पहचानकर्ताओं के लिए है और जीवनकाल कुछ और है, जहां हम वस्तु को संग्रहीत करते हैं।

इसके अतिरिक्त, मैं linkage बारे में कुछ कहना चाहता हूं जो इस से निकटता से संबंधित है। यह कभी-कभी भ्रमित हो सकता है। मान लीजिए कि हमारे पास कुछ यूनिट्स को संदर्भ translation unit में अनुवादकर्ता में कुछ पहचानकर्ता हैं। क्या other अनुवाद इकाई में एक ही पहचानकर्ता समान संस्थाओं को दर्शाएगा, जो संबंध से संबंधित है। इसलिए, उदाहरण के लिए, यदि एक पहचानकर्ता के पास एक बाहरी संबंध है, तो हम उस इकाई को संदर्भित कर सकते हैं जो इस पहचानकर्ता को अन्य अनुवाद इकाई से खोजशब्द extern साथ घोषित कर रहा है। अब, मान लें कि हम उस इकाई को अन्य अनुवाद इकाइयों में उपयोग नहीं करना चाहते हैं। फिर, कार्यक्रम समाप्त होने तक इकाई exist होगी, लेकिन जब हम इसे घोषित नहीं करते हैं, तो हम इसका संदर्भ नहीं दे पाएंगे। यह भी ध्यान रखें कि अब मैं शर्तों के लिंकेज और जीवनकाल को मिश्रित करता हूं। लेकिन इसका कारण यह है कि केवल global संस्थाओं में बाहरी संबंध हैं फ़ंक्शन के अंदर एक पहचानकर्ता कार्यक्रम के दूसरे भागों से नहीं भेजा जा सकता है।

निष्कर्ष: हमेशा चीज़ों को सरल रखने का प्रयास करें मुझे आश्चर्य था कि अलग-अलग लोग इन शब्दों के बारे में अलग-अलग बात करते हैं। अलग संकलन की पूरी प्रक्रिया भ्रामक है, क्योंकि कई शब्द हैं जो लगभग समान अर्थ हैं और संभवतः सभी इस बिंदु पर फंसेंगे।

जब आप उदाहरण के लिए एक वैश्विक चर int i घोषित करते हैं, तो हम कहते हैं कि i is in the global namespace और has the global namespace scope । बस इतना ही।

सी ++ 03 से उद्धरण:

 3.3.5 Namespace scope The outermost declarative region of a translation unit is also a namespace, called the global namespace. A name declared in the global namespace has global namespace scope (also called global scope).