using namespace std;

प्रथमच C++ शिकणाऱ्या जवळपास प्रत्येक विद्यार्थ्याला छळणारे असे हे स्टेटमेंट…! विशेष करून चौकस बुद्धी असणाऱ्या सर्व विद्यार्थांचा हा छ्ळ C++ चा अभ्यासक्रम पुर्ण झाल्यानंतर सुद्धा सुरू असतो. हा सर्व मनस्ताप होतो ते पडणाऱ्या अनेक प्रश्नांच्या मुळे… जसे की

  • namespace म्हणजे नेमका काय प्रकार आहे…?
  • Using namespace std असे का लिहायचे…?
  • Std अशा नावाचे नेमस्पेस कुठे आहे, कोणी तयार केले वगैरे वगैरे….
  • दरवेळी std हेच नेमस्पेस वापरले व दुसरे वापरलेच नाही तर हे कशाला वापरायचे…?
  • Std हे एकच नेमस्पेस आहे की अजूनही काही नेमस्पेस आहेत…?
  • आपल्याला स्वत:ला असे उद्योग करता येतात काय?
  • आपण फाइल include करतोच तर मग नेमस्पेस चा उल्लेख का करावा लागतो वगैरे वगैरे…

शिवाय viva ला अथवा interview ला यावर प्रश्न विचारतील ही मनात भिती असतेच. त्यामुळे पाठ करून उत्तर देउन वेळ मारून दिली म्हणजे काम भागते असाच प्रकार होतो. हे सर्व नको म्हणून हि पोस्ट…

प्रथम हे समजून घेतले पाहीजे की व्हेअरेबल्स, फंक्शन इत्यादी च्या स्कोप संदर्भात हे स्टेटमेंट आहे. मुख्यता व्हेअरेबल ला ग्लोबल किंवा लोकल स्कोप असतो. शिवाय लोकल स्कोप हा फंक्शन स्कोप असेल किंवा लुप किंवा इफ-एल्स ब्लॉक च्या बॉडीचा स्कोप असेल… या उलट ग्लोबल स्कोप ला आपण फाइल स्कोप असे सुद्धा म्हणतो. या दोनही च्या मध्ये एखादा स्कोप करायचा म्हणले तर मात्र C मध्ये त्याची व्यवस्था डेनीस कडून झालेली दिसत नाही.

एखादा प्रोग्रॅम जसा जसा कॉंम्प्लेक्स होत जातो त्यावेळी व्हेअरेबल्सची संख्या वाढत जाते. एखाद्या कपाटा मध्ये किंवा ऑफीस टेबल मध्ये आपण जसे वेगवेगळे कप्पे केले की वस्तू ठेवता येतात तसेच कप्पे C++ मध्ये करण्याची सोय स्ट्राउस्ट्रुप ने करून ठेवली व त्यालाच नेमस्पेस म्हणतात. व्हेअरेबल्स व फंक्शन्सची नेम्स conflict होउ नयेत हा उद्देश त्या मागे आहे.

या ठिकाणी usingnamespace हे दोनही C++ मधील keywords आहेत हे लक्षात घ्या.

समजा एकदम बेसीक प्रोग्रॅम तुम्ही लिहीला… Hello World चा…. तर तो साधारण पणे असा असतो…

01

आता या प्रोग्रॅम मध्ये cout प्रिंटींग करण्यासाठी वापरला आहे व endl हा नेक्स्ट लाइन ला कर्सर नेण्यासाठी वापरला आहे. हे सर्व शक्य झाले आहे ते std या नावाच्या नेमस्पेस मुळे…. ते कसं काय झालं…?

तर हेडर फाइल हा कंसेप्ट सुरवातीच्या C++ मधून काढून टाकला व C++ मधील जवळपास सर्व फीचर्स C++ च्या standard library मधील एका ठरावीक भागामध्ये टाकली व त्या स्पेस ला std असे नेम दिले… म्हणून std हे C++ चे predefined namespace आहे ज्या मध्ये cout, cin, string, vector, map इत्यादी. सर्व ठेवले आहे. अर्थातच cout, cin या सारख्याचा वापर करतांना ते कोठून घ्यायचे असे कंपायलरला सांगण्यासाठी आपल्याकडे दोन मार्ग आहेत.

एक म्हणजे वरील प्रोग्रॅम मध्ये वापर केल्याप्रमाणे सुरवातीलाच using namespace std असे स्टेटमेंट लिहून कंपायलरची भुक भागवायची…. त्यामुळे त्या नंतर तुम्ही std मध्ये उपलब्ध असलेल्या objects, variables, function या कशाचाही उल्लेख करतांना कंपायलरला संभ्रम पडणार नाही.

दुसरा मार्ग म्हणजे using namespace std असे स्टेटमेंट न लिहीता… कोणतीही व्हेअरेबल्स, ऑब्जेक्ट्स, फंक्शंन्स वापरतांना ती कोणत्या namespace मधील आहेत याचा प्रत्येक वेळी उल्लेख करायचा. जसे की या खालील प्रोग्रॅम मध्ये केला आहे

02

कंपायलरला नेम conflict मुळे संभ्रम न करण्याच्या नादात आता या दोनही मधील कोणता मार्ग वापरावा या बद्दल मात्र नक्की संभ्रम झाला असेल. त्यापैकी पहीली पद्धत जवळपास सर्व ठिकाणी शिकवली जाते व ती सुटसुटीत आहे. पण दुसरी पद्धत वापरणेच चांगले असे तज्ञ प्रोग्रॅमर लोकांचे म्हणणे आहे. याचे कारण म्हणजे दुसऱ्या पद्धती मध्ये स्पेसीफीकली कंपायलरला तुम्ही डायरेक्ट करत आहात. ज्यावेळी दोन कींवा जास्त नेमस्पेस प्रोग्रॅम मध्ये वापरले जातात त्या वेळी हीच दुसरी पद्धत वापरली जाते.

उदा: std या नेमस्पेस मध्ये count नावाचा identifier आहे. Count हे नाव इतके कॉमन आहे की तुम्ही डिक्लेअर केलेले count व std या namespace मध्ये असलेले count या मध्ये कंपायलरची सहजासहजी गफलत होउ शकते. त्यामुळे दुसरी पद्धत good programming practice समजली जाते…..!

03

आता प्रश्न असा उरतो की std शिवाय काही namespace आहेत की नाही… तर तुम्हाला कायम लागणारी सर्व फंक्शनॅलीटी std या नेमस्पेस मध्ये टाकली आहे. या व्यतीरीक्त अजून दोन नेमस्पेस प्रामुख्याने C++ च्या लायब्ररी मध्ये आहेत. ती म्हणजे abi आणी __gnu__.

तुम्ही स्वत: चे नेमस्पेस सुद्धा

namespace  <name space name>
{

identifier list

}

स्वत:ची नेमस्पेस तयार करून व्हेअरेबल्सची होणारी नेम conflicts तुम्ही टाळू शकता. शेवटी आपल्या आयुश्यात गोंधळ न होण्यासाठी आपण काही उपाय योजना करतो त्याच प्रमाणे असा सावळा गोंधळ प्रोग्रॅम लिहीतांना होउ नये म्हणून स्ट्राउस्ट्रुपने ही व्यवस्था केली असावी…!