निम्नलिखित कार्यक्रम में वैश्विक दायरे में निम्नलिखित दो अदिश कथनों पर विचार करें:
#शामिल
नेमस्पेस एसटीडी का उपयोग करना;
NSvarId= 5;
पानी पर तैरनाvarId= २.३;
NSमुख्य()
{
वापसी 0;
}
इस प्रोग्राम को संकलित करने का प्रयास संकलन त्रुटि की ओर ले जाता है। एक ही नाम के दो चर हैं, varId . यद्यपि वे दो भिन्न प्रकार के दो भिन्न चर हैं, NS तथा पानी पर तैरना , संकलक दो घोषणाओं को अस्वीकार करता है क्योंकि वे एक ही नाम के हैं। निम्नलिखित कार्यक्रम दो अलग-अलग सामान्यीकृत क्षेत्रों में समान नाम वाले चर घोषित करके इस समस्या को हल करता है:
#शामिल
नेमस्पेस एसटीडी का उपयोग करना;
नाम स्थान NA
{
NSvarId= 5;
}
नेमस्पेस एनबी
{
पानी पर तैरनाvarId= २.३;
}
NSमुख्य()
{
लागत<<ना::varId << 'एन';
लागत<<नायब::varId << 'एन';
वापसी 0;
}
आउटपुट इस प्रकार है:
5
२.३
उपरोक्त कार्यक्रम में दो नामस्थान हैं: ना , जिसमें एक पूर्णांक की परिभाषा है, और नायब , जिसमें एक फ्लोट की परिभाषा है लेकिन एनए के लिए पूर्णांक के समान नाम के साथ। अंत में, जब प्रोग्राम चलाया गया, तो दो भिन्न चरों के लिए एक ही नाम का उपयोग किया गया। ध्यान दें कि दो अलग-अलग चरों के एक ही नाम तक पहुँचने के लिए, नाम स्थान के लिए विशेष नाम का उपयोग किया जाना चाहिए, उसके बाद सामान्य पहचानकर्ता का उपयोग किया जाना चाहिए। नेमस्पेस नाम और सामान्य पहचानकर्ता को स्कोप रेज़ोल्यूशन ऑपरेटर द्वारा अलग किया जाता है, :: . नामस्थानों का नाम वस्तुओं को अलग करेगा।
यह आलेख नामस्थान की मूल अवधारणा और सी ++ प्रोग्रामिंग भाषा में इसके उपयोग को शामिल करता है। इस लेख का अनुसरण करने के लिए, आपको C++ भाषा का बुनियादी ज्ञान होना चाहिए। आपको C++ स्कोप का भी ज्ञान होना चाहिए, हालांकि इसे इस लेख में संक्षेप में समझाया गया है। C++ स्कोप के बारे में अधिक जानने के लिए, किसी भी linuxhint.com वेब पेज के सर्च बॉक्स में स्कोप, C++ में स्कोप (बिना उद्धरण के) खोजें और एंटर दबाएं। यह आपको इस लेखक द्वारा लिखे गए लेख तक ले जाएगा।
लेख सामग्री
नेमस्पेस क्या है?
एक घोषणात्मक क्षेत्र एक कार्यक्रम का सबसे बड़ा हिस्सा है जिसमें एक इकाई (चर) का नाम मान्य होता है। इस क्षेत्र को स्कोप कहा जाता है। सी ++ में एक नेमस्पेस एक सामान्यीकृत दायरा है जिसका मुख्य उद्देश्य नाम संघर्षों को हल करना है। नामस्थान में मूलभूत घोषणाएं और/या संस्थाओं की परिभाषाएं होती हैं।
ग्लोबल नेमस्पेस और इसकी समस्या
वैश्विक नामस्थान वैश्विक दायरा है। निम्नलिखित संक्षिप्त कार्यक्रम पर विचार करें:
#शामिलनेमस्पेस एसटीडी का उपयोग करना;
NSअध्यक्ष= 55;
पानी पर तैरनाअध्यक्ष= 12.17;
NSमुख्य()
{
वापसी 0;
}
उपरोक्त कार्यक्रम में, दो चर हैं, दोनों को कहा जाता है अध्यक्ष . ये चर वैश्विक दायरे में हैं; यानी, वे वैश्विक नामस्थान में हैं। इस प्रोग्राम को संकलित करने का प्रयास एक त्रुटि संदेश के साथ विफल हो जाएगा। वैश्विक दायरा एक ही नाम के एक से अधिक चर को स्वीकार नहीं करता है, इसलिए एक कस्टम नाम स्थान की आवश्यकता है।
कस्टम नेमस्पेस
एक नाम स्थान में केवल एक ही नाम नहीं होता है। इसके बजाय, नामों के अन्य सेटों के साथ विरोध से बचने के लिए नामस्थान में नामों का एक समूह होता है। कोड में कम विरोध से बचने के लिए, नाम स्थान के नाम के साथ प्रत्येक नाम से पहले और :: . निम्नलिखित प्रोग्राम दो कस्टम नामस्थानों का उपयोग करके इसे दिखाता है:
#शामिलनेमस्पेस एसटीडी का उपयोग करना;
नाम स्थान NA
{
NSvarInt= 6;
पानी पर तैरनाफ्लाइट;
}
नेमस्पेस एनबी
{
NSvarInt= 7;
पानी पर तैरनाफ्लाइट;
}
NSमुख्य()
{
लागत<<ना::varInt << 'एन';
लागत<<नायब::varInt << 'एन';
ना::फ्लाइट = 2.5;
नायब::फ्लाइट = 4.8;
लागत<<ना::फ्लाइट << 'एन';
लागत<<नायब::फ्लाइट << 'एन';
वापसी 0;
}
आउटपुट है:
67
2.5
4.8
ध्यान दें कि नाम एनए :: एफएलटी तथा एनबी :: एफएलटी अंततः में परिभाषित किया गया है मुख्य() समारोह। सी ++ वैश्विक दायरे में ऐसी परिभाषा की अनुमति नहीं देता है।
ध्यान दें कि कस्टम नेमस्पेस ग्लोबल नेमस्पेस के लिए नेस्टेड नेमस्पेस है।
निर्देश का उपयोग करना
नेमस्पेस घोषित करने के बाद सिर्फ नाम के बजाय नेमस्पेस :: नाम टाइप करने से बचने के लिए, आप इसका उपयोग कर सकते हैं का उपयोग करते हुए निर्देश। वाक्य रचना का उपयोग करने के लिए का उपयोग करते हुए निर्देश इस प्रकार है:
नामस्थान का उपयोग करना Namespace_name;NS का उपयोग करते हुए निर्देश एक प्रीप्रोसेसर निर्देश नहीं है, इसलिए यह अर्धविराम (;) के साथ समाप्त होता है।
निम्नलिखित कार्यक्रम के उपयोग को दर्शाता है: का उपयोग करते हुए निर्देश और अधिक:
#शामिलनेमस्पेस एसटीडी का उपयोग करना;
नेमस्पेस एनबी
{
NSvarInt= 7;
NSसमारोह()
{
वापसीvarInt;
}
}
NSएफएन()
{
नेमस्पेस एनबी का उपयोग करना;
NSmyVar2=समारोह();
// एनबी से अन्य वस्तुएं और कार्य अनुसरण करते हैं।
वापसीmyVar2;
}
NSmyVar3=नायब::समारोह();
NSमुख्य()
{
लागत<<एफएन() << '' <<myVar3<< 'एन';
वापसी 0;
}
इस कार्यक्रम का आउटपुट है 7 7 . शब्द नेमस्पेस एनबी का उपयोग करना; की शुरुआत में रखा गया है एफएन () परिभाषा। NS फंक () एनबी नेमस्पेस से ठीक नीचे कहा जाता है, बिना पूर्ववर्ती के नायब:: .
वैश्विक दायरे (वैश्विक नाम स्थान) में घोषित एक चर को घोषणा के बिंदु से फ़ाइल के अंत तक देखा जाता है। इसे नेस्टेड नेमस्पेस (नेस्टेड स्कोप) में भी देखा जाता है, जैसे कि नेस्टेड एफएन () ऊपर समारोह का दायरा। NS का उपयोग करते हुए निर्देश अपने नामस्थान को उस स्थिति से जोड़ता है जिस पर इसे उस दायरे के अंत में रखा जाता है जिसमें इसे रखा जाता है।
नाम फंक () एनबी नेमस्पेस से नीचे नहीं देखा जा सकता है एफएन () परिभाषा क्योंकि नेमस्पेस एनबी का उपयोग करना; फ़ंक्शन स्कोप (ब्लॉक) के भीतर रखा गया था। इस शर्त के तहत उपयोग करने के लिए फंक () एनबी नेमस्पेस ब्लॉक (दायरे) के बाहर, इसके पहले होना चाहिए नायब:: , जैसा कि निम्नलिखित कथन में है:
NSmyVar3=नायब::समारोह();NS का उपयोग करते हुए निर्देश अपने नेमस्पेस को बाहरी नेस्टिंग नेमस्पेस के साथ उस स्थिति से जोड़ता है जिस पर इसे बाहरी नेस्टिंग नेमस्पेस के अंत में रखा जाता है। निम्नलिखित प्रोग्राम में, NA नेमस्पेस को ग्लोबल नेमस्पेस के साथ जोड़ा गया है। दोनों नामस्थान तब में विस्तारित होते हैं एफएन () फंक्शन डेफिनिशन नेमस्पेस, जिसमें वे एनबी नेमस्पेस के साथ जुड़ जाते हैं। एनबी नेमस्पेस के अंत में समाप्त होता है एफएन () फ़ंक्शन परिभाषा, और दो पिछले नामस्थान फ़ाइल के अंत तक चलते हैं (कोड के माध्यम से पढ़ें)।
#शामिलनेमस्पेस एसटीडी का उपयोग करना;
नाम स्थान NA
{
NSvarInt= 6;
NSसमारोह()
{
वापसीvarInt;
}
}
नेमस्पेस एनबी
{
NSvarInt= 7;
NSसमारोह()
{
वापसीvarInt;
}
}
नाम स्थान का उपयोग करना NA;
NSmyVar0=varInt;
// अन्य वस्तुओं और कार्यों से :: और एनबी अनुसरण करते हैं।
NSएफएन()
{
NSmyVar1=varInt;
नेमस्पेस एनबी का उपयोग करना;
NSmyVar2=नायब::समारोह();
// इस दायरे के अंत तक एनबी से अन्य वस्तुएं और कार्य अनुसरण करते हैं।
वापसीmyVar1+myVar2;
}
// केवल वस्तुओं और कार्यों से :: और NB अनुसरण करते हैं।
NSmyVar3=नायब::समारोह();
NSमुख्य()
{
लागत<<myVar0<< '' <<एफएन() << '' <<myVar3<< 'एन';
वापसी 0;
}
आउटपुट है 6, 13, 7 .
ध्यान दें: वैश्विक नामस्थान को के साथ दर्शाया गया है :: , जिसका अर्थ है कि स्कोप रिज़ॉल्यूशन ऑपरेटर के सामने कुछ भी नहीं है।
बयान के नीचे, नेमस्पेस एनए का उपयोग करना; वैश्विक और एनए नामस्थानों के चर का उपयोग उनके स्रोत नामस्थान के संकेत के बिना किया जा सकता है। अगला कथन का उपयोग करता है varInt एनए नेमस्पेस का। वैश्विक और एनए संयुक्त नामस्थान क्षेत्र में फैला हुआ है एफएन () फ़ंक्शन नामस्थान। ऐसा varInt में पहले बयान के एफएन () फ़ंक्शन स्कोप, NA नेमस्पेस का है।
चूंकि वैश्विक और एनए नेमस्पेस के लिए क्षेत्र पूरे क्षेत्र में फैला हुआ है एफएन () गुंजाइश, के बाद int myVar2 = एनबी :: func (); , NB नाम स्थान से किसी भी नाम का उपयोग केवल में किया जा सकता है एफएन () इसके साथ पहले के बिना गुंजाइश नायब:: , केवल अगर यह एनए और वैश्विक नामस्थान (ब्लॉक) में नहीं हुआ। अन्यथा, इससे पहले होना चाहिए नायब:: . एनए और वैश्विक के लिए संयुक्त नामस्थान का क्षेत्र नीचे जारी है एफएन () परिभाषा और में मुख्य() फ़ाइल के अंत तक कार्य करें।
एनबी नेमस्पेस का विस्तार शुरू होता है int myVar2 = एनबी :: func (); में एफएन () के अंत में ब्लॉक और समाप्त होता है एफएन () परिभाषा ब्लॉक।
ध्यान दें: नामस्थान जिनके क्षेत्र जुड़े हुए हैं, उनके अलग-अलग नामस्थान ब्लॉक में एक ही चर नाम नहीं होना चाहिए, क्योंकि यह अभी भी संघर्ष का कारण होगा।
नाम स्थान क्षेत्र
एक नामस्थान एक दायरा है। ग्लोबल नेमस्पेस (ग्लोबल स्कोप) के अलावा, किसी भी नेमस्पेस को ब्लॉक में घोषित किया जाना चाहिए। वह ब्लॉक नामस्थान के संभावित रूप से वितरित क्षेत्रों का पहला भाग है। प्रयोग निर्देश के साथ, नामस्थान को अन्य क्षेत्रों में क्षेत्रों के रूप में विस्तारित किया जा सकता है।
नामस्थान निकाय में घोषित संस्थाओं को नामस्थान के सदस्य कहा जाता है, और नामस्थान के घोषणात्मक क्षेत्र में इन घोषणाओं द्वारा पेश किए गए नामों को नामस्थान के सदस्य नाम कहा जाता है।
नेस्टेड नेमस्पेस
निम्नलिखित प्रोग्राम नेस्टेड नेमस्पेस दिखाता है:
#शामिलनेमस्पेस एसटीडी का उपयोग करना;
नेमस्पेस ए
{
NSमैं= 1;
नेमस्पेस बी
{
NSमैं= 2;
नेमस्पेस सी
{
NSमैं= 3;
}
}
}
NSमुख्य()
{
लागत<<प्रति::मैं << '' <<प्रति::बी::मैं << '' <<प्रति::बी::सी::मैं << 'एन';
वापसी 0;
}
आउटपुट है:
१ २ ३ध्यान दें कि तीन मानों को स्कोप रेज़ोल्यूशन ऑपरेटर का उपयोग करके एक्सेस किया गया है।
मानक नाम स्थान
सी ++ में एक पुस्तकालय है जिसे मानक पुस्तकालय कहा जाता है। इस पुस्तकालय में वस्तुओं, कार्यों और अन्य संस्थाओं के नाम एक नाम स्थान से हैं, जिसे मानक नाम स्थान कहा जाता है, जिसे के रूप में लिखा जाता है घंटे . मानक पुस्तकालय में उप-पुस्तकालय होते हैं, और इनमें से एक उप-पुस्तकालय है iostream . NS iostream पुस्तकालय में वस्तु है लागत , जिसका उपयोग कंसोल (टर्मिनल) पर परिणाम भेजने के लिए किया जाता है।
नाम लागत में होना चाहिए घंटे नाम स्थान। काम में लाना iostream के साथ घंटे नाम स्थान, कार्यक्रम इस प्रकार होना चाहिए:
#शामिलनेमस्पेस एसटीडी का उपयोग करना;
के उपयोग पर ध्यान दें का उपयोग करते हुए निर्देश और घंटे . शब्द #शामिल एक प्रीप्रोसेसर निर्देश है और अर्धविराम के साथ समाप्त नहीं होता है। इसमें अपने निर्देश की स्थिति में iostream फ़ाइल शामिल है।
निष्कर्ष
एक नामस्थान एक दायरा है। नेमस्पेस विवरण (परिभाषा) में C++ ऑब्जेक्ट्स, फ़ंक्शंस और अन्य संस्थाओं की मूल घोषणाएँ और/या परिभाषाएँ शामिल हैं। नेमस्पेस परिभाषा के बाहर, नाम को सिंटैक्स के साथ एक्सेस किया जा सकता है, नामस्थाननाम::नाम . ग्लोबल नेमस्पेस (ग्लोबल स्कोप) के अलावा, किसी भी नेमस्पेस को ब्लॉक में घोषित किया जाना चाहिए। वह ब्लॉक नामस्थान के संभावित रूप से वितरित क्षेत्रों का पहला भाग है। उसके साथ का उपयोग करते हुए निर्देश, नाम स्थान को अन्य क्षेत्रों में क्षेत्रों के रूप में बढ़ाया जा सकता है। नामस्थान जिनके क्षेत्र जुड़े हुए हैं, उनके अलग-अलग नामस्थान ब्लॉक में एक ही चर नाम नहीं होना चाहिए, क्योंकि यह अभी भी नाम संघर्ष का कारण होगा।
क्रिसो