Namespaces in C++
Namespace क्या है?
Namespace संबंधित identifiers के लिए एक नामित डिब्बा है। इसका काम नाम टकराव रोकना है: दो libraries हर एक का print() बिना संघर्ष हो सकता है, क्योंकि एक LibA::print है और दूसरा LibB::print। आप scope resolution operator :: से चुनते हैं।
Namespace परिभाषित करना
#include <iostream>
using namespace std;
namespace Math {
int square(int x) { return x * x; }
}
namespace Physics {
int square(int x) { return x * x * 2; } // alag arth
}
int main() {
cout << Math::square(4) << "\n"; // 16
cout << Physics::square(4) << "\n"; // 32
return 0;
}16
32
using directive
using namespace X; X के सभी नाम scope में लाता है; एक using declaration केवल एक लाता है:
using namespace Math; // poora Math using Physics::square; // sirf yeh ek naam
using declaration (using X::name;) पूरे directive से सुरक्षित है, खासकर headers में।
std namespace
पूरी standard library std में रहती है — इसीलिए यह std::cout, std::vector, std::string है। using namespace std; लिखना आपको prefix छोड़ने देता है, छोटे programs में काम का पर बड़े में या headers में जोखिम भरा।
Nested namespaces
namespace App {
namespace UI {
void draw() {}
}
}
// call: App::UI::draw();
// C++17 shortcut: namespace App::UI { void draw() {} }Anonymous namespaces
बिना नाम का namespace अपनी सामग्री वर्तमान file तक निजी रखता है — file-scope static का आधुनिक विकल्प:
namespace {
int helper() { return 42; } // sirf is file me dikhta hai
}आम गलतियाँ
- Header में
using namespace std;, इसे हर file में रिसाते हुए जो इसे include करे। - दो using directives जो टकराते नाम import करें, ambiguity पैदा करते हुए।
- जब नाम namespace में हो तब
::भूलना। - लक्षित declarations के बजाय व्यापक directives का अति-इस्तेमाल।
दो namespaces Metric और Imperial बनाएँ, हर एक में अलग units लौटाने वाला distance() function हो। दोनों को scope operator से call करें, फिर एक को using declaration से लाएँ।
सारांश
- Namespaces नाम टकराव रोकने को नामों को समूहित करते हैं।
- Scope resolution operator
::से एक नाम चुनें। using namespace X;सब import करता है;using X::name;एक।- Standard library
stdमें रहती है। - Anonymous namespaces file-local (internal) linkage देते हैं।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C++ में namespace क्या है?
print नामक function परिभाषित कर सकती हैं बशर्ते हर एक अपने namespace के अंदर हो, और आप scope resolution operator से चुनते हैं किसे।C++ में using namespace std क्या करता है?
using namespace std; standard library के std namespace के सभी नाम scope में लाता है, तो आप std::cout के बजाय cout लिख सकते हैं। यह छोटे programs के लिए सुविधाजनक है पर बड़े code में नाम टकराव पैदा कर सकता है, जहाँ नाम qualify करना या संकरे using declarations सुरक्षित हैं।C++ में scope resolution operator क्या है?
:: किसी विशेष namespace या class से एक नाम चुनता है, जैसे std::cout या MyLib::init()। यह compiler को ठीक बताता है कि आप किस नाम का version चाहते हैं जब वही नाम एक से ज़्यादा scope में हो।C++ में using directive और using declaration में क्या अंतर है?
using namespace X;, namespace X से हर नाम लाता है। using declaration, using X::name;, केवल एक विशिष्ट नाम लाता है। Declaration ज़्यादा लक्षित और सुरक्षित है क्योंकि यह वर्तमान scope को namespace की हर चीज़ से नहीं भरता।C++ में anonymous namespace क्या है?
static keyword के इस्तेमाल की जगह।