सबसे पहले, कुछ शब्दावली:
- उपयोग-घोषणा :
using std::vector;
- उपयोग-निर्देश :
using namespace std;
मुझे लगता है कि जब तक वे हेडर फ़ाइल में वैश्विक दायरे में उपयोग नहीं किए जाते हैं, तब तक निर्देशों का उपयोग करना ठीक है। इसलिए होने
using namespace std;
आपकी .cpp फ़ाइल में वास्तव में कोई समस्या नहीं है, और यदि यह पता चला है, तो यह पूरी तरह से आपके नियंत्रण में है (और यदि वांछित है तो इसे विशेष ब्लॉक में भी स्कैन किया जा सकता है)। मुझे क्वालीफ़ायर के एक स्लीव के साथ कोड को अव्यवस्थित करने के लिए कोई कण नहीं दिखता है std::
- यह सिर्फ दृश्य शोर का एक गुच्छा बन जाता है। हालाँकि, यदि आप std
अपने कोड में नेमस्पेस से नामों की एक पूरी गुच्छा का उपयोग नहीं कर रहे हैं, तो मुझे निर्देश छोड़ने के साथ कोई समस्या नहीं है। यह एक टॉटोलॉजी है - यदि निर्देश आवश्यक नहीं है, तो इसका उपयोग करने की कोई आवश्यकता नहीं है।
इसी तरह, यदि आप नेमस्पेस में विशिष्ट प्रकारों के लिए कुछ प्रयोग-घोषणाओं ( उपयोग-निर्देशों के बजाय ) के साथ प्राप्त कर सकते हैं std
, तो कोई कारण नहीं है कि आपके पास वर्तमान नामस्थान में लाए गए उन नाममात्र के नाम नहीं होने चाहिए। एक ही टोकन से, मुझे लगता है कि यह पागल होगा और एक बहीखाता पद्धति में 25 या 30 का उपयोग करने की घोषणा होगी जब एक एकल-निर्देश का उपयोग चाल के रूप में भी किया जाएगा।
यह भी ध्यान में रखना अच्छा है कि ऐसे समय होते हैं जब आपको एक प्रयोग-घोषणा का उपयोग करना चाहिए । स्कॉट मेयर्स का संदर्भ लें "आइटम 25: प्रभावी सी ++, तीसरे संस्करण से एक गैर-फेंकने वाली स्वैप के लिए समर्थन पर विचार करें।" एक सामान्य, टेम्प्लेट किए गए फ़ंक्शन के लिए एक पैरामीटर प्रकार के लिए 'सर्वोत्तम' स्वैप विधि का उपयोग करें, आपको एक उपयोग-घोषणा और तर्क निर्भर लुकअप (उर्फ एडीएल या कोएनिग लुकअप) का उपयोग करने की आवश्यकता है:
template< typename T >
void foo( T& x, T& y)
{
using std::swap; // makes std::swap available in this function
// do stuff...
swap( x, y); // will use a T-specific swap() if it exists,
// otherwise will use std::swap<T>()
// ...
}
मुझे लगता है कि हमें विभिन्न भाषाओं के सामान्य मुहावरों को देखना चाहिए जो नामस्थानों का महत्वपूर्ण उपयोग करते हैं। उदाहरण के लिए, जावा और सी # काफी हद तक नामस्थानों का उपयोग करते हैं (यकीनन C ++ की तुलना में)। नेमस्पेस में सबसे सामान्य तरीके के नाम का उपयोग उन भाषाओं में किया जाता है, जो उन्हें एक प्रयोग-निर्देश के समतुल्य वर्तमान दायरे में लाते हैं। यह व्यापक रूप से फैलने वाली समस्याओं का कारण नहीं बनता है, और कुछ ही बार यह एक समस्या है जिसे पूरी तरह से योग्य नामों के माध्यम से या अलियासिंग के माध्यम से प्रश्न में नामों से निपटने के आधार पर 'अपवाद' के आधार पर नियंत्रित किया जाता है - जैसे C ++ में किया जा सकता है।
हर्ब सटर और आंद्रेई अलेक्जेंड्रेस्कु के पास यह कहना है कि "आइटम 59: हेडर फाइल में नेमस्पेस यूज़र्स न लिखें या उनकी किताब के एक #include से पहले, C ++ कोडिंग स्टैंडर्ड्स: 101 रूल्स, गाइडलाइन्स और बेस्ट प्रैक्टिस:
संक्षेप में: आप #include
निर्देशों के बाद अपने कार्यान्वयन की फाइलों में उदारतापूर्वक घोषणाओं और निर्देशों का उपयोग करके नाम स्थान का उपयोग कर सकते हैं और इसके बारे में अच्छा महसूस करते हैं। इसके विपरीत बार-बार जोर देने के बावजूद, घोषणाओं और निर्देशों का उपयोग करने वाले नाम स्थान बुराई नहीं हैं और वे नाम स्थान के उद्देश्य को नहीं हराते हैं। बल्कि, वे हैं जो नामस्थानों को प्रयोग करने योग्य बनाते हैं।
"द सी ++ प्रोग्रामिंग लैंग्वेज, थर्ड एडिशन" में स्ट्रूपस्ट्रैप को अक्सर कहा जाता है, "ग्लोबल नेमस्पेस को प्रदूषित न करें"। वह वास्तव में कहता है कि (C.14 [15]), लेकिन अध्याय C.10.1 को संदर्भित करता है जहां वह कहता है:
एक प्रयोग-घोषणा में एक नाम स्थानीय दायरे में जोड़ा जाता है। एक का उपयोग-निर्देश नहीं करता है; यह केवल उस दायरे में सुलभ नामों को प्रस्तुत करता है जिनमें उन्हें घोषित किया गया था। उदाहरण के लिए:
namespaceX {
int i , j , k ;
}
int k ;
void f1()
{
int i = 0 ;
using namespaceX ; // make names from X accessible
i++; // local i
j++; // X::j
k++; // error: X::k or global k ?
::k ++; // the global k
X::k ++; // X’s k
}
void f2()
{
int i = 0 ;
using X::i ; // error: i declared twice in f2()
using X::j ;
using X::k ; // hides global k
i++;
j++; // X::j
k++; // X::k
}
एक स्थानीय रूप से घोषित नाम (एक साधारण घोषणा द्वारा या एक प्रयोग-घोषणा द्वारा घोषित) एक ही नाम की गैर-घोषणाओं को छुपाता है, और नाम के किसी भी अवैध अधिभार को घोषणा के बिंदु पर पता लगाया जाता है।
के लिए अस्पष्टता त्रुटि नोट k++
में
f1()
। वैश्विक दायरे में सुलभ किए गए नामस्थानों से नामों पर वैश्विक नामों को वरीयता नहीं दी जाती है। यह आकस्मिक नाम के टकराव के खिलाफ महत्वपूर्ण सुरक्षा प्रदान करता है, और - महत्वपूर्ण रूप से - यह सुनिश्चित करता है कि वैश्विक नामों को प्रदूषित करने से कोई लाभ प्राप्त न हो।
जब कई नामों की घोषणा करने वाले पुस्तकालयों को उपयोग-निर्देशों के माध्यम से सुलभ बनाया जाता है, तो यह एक महत्वपूर्ण लाभ है कि अप्रयुक्त नामों की झड़पों को त्रुटियां नहीं माना जाता है।
...
मुझे पारंपरिक सी और सी ++ कार्यक्रमों की तुलना में नामस्थानों का उपयोग करके नए कार्यक्रमों में वैश्विक नामों के उपयोग में एक क्रांतिकारी कमी देखने की उम्मीद है। नाम स्थान के नियमों को विशेष रूप से किसी ऐसे व्यक्ति पर वैश्विक नामों के '' आलसी '' उपयोगकर्ता को कोई लाभ नहीं देने के लिए तैयार किया गया था जो इस बात का ध्यान रखता है कि वैश्विक दायरे को प्रदूषित न करें।
और किसी को 'वैश्विक नामों के आलसी उपयोगकर्ता' के समान लाभ कैसे होता है? उपयोग-निर्देश का लाभ उठाकर, जो सुरक्षित रूप से एक नाम स्थान में मौजूदा दायरे में उपलब्ध कराता है।
ध्यान दें कि एक नाम- std
स्थान में उपलब्ध नाम-निर्देश एक प्रयोग-निर्देश के उचित उपयोग के साथ एक गुंजाइश को उपलब्ध कराया गया है (निर्देश के बाद रखकर #includes
) वैश्विक नाम स्थान को प्रदूषित नहीं करता है । यह सिर्फ उन नामों को आसानी से उपलब्ध करा रहा है, और झड़पों के खिलाफ निरंतर सुरक्षा के साथ।