namespace
فضاءات الأسماء namespace
namespace تجمع مجموعة أسماء (دوال، أصناف، متغيرات) تحت مظلة واحدة لتفادي تعارض الأسماء بين مكتبات مختلفة.
بمشروع كبير يستخدم عدة مكتبات، احتمال تكرار اسم دالة أو صنف بين مكتبتين وارد جدًا. namespace يحل هذا بتغليف الأسماء داخل نطاق مسمّى، فتنادي العنصر بصيغة NamespaceName::Item بدل تعارضه المباشر مع اسم مشابه بمكان آخر. مكتبة C++ القياسية كلها موجودة داخل std::.
تجنّب using namespace std; بملفات header — تسحب كل الأسماء لنطاق عام وتزيد احتمال التعارض بمشاريع كبيرة؛ استخدم إما البادئة std:: صراحة أو using std::cout; لعنصر واحد فقط.
الصياغة
namespace Name {
// دوال وأصناف ومتغيرات
}
Name::item;📄 مثال
namespace Math {
double square(double x) { return x * x; }
}
namespace Physics {
double square(double x) { return x * x * 9.8; } // اسم متطابق، بدون تعارض
}
std::cout << Math::square(4) << " " << Physics::square(4);أهم النقاط
| العنصر | الوظيفة |
|---|---|
| namespace X { } | تعريف فضاء اسم جديد يحتوي عناصر مرتبطة |
| X::item | الوصول لعنصر داخل فضاء اسم محدد |
| using namespace X; | يسحب كل أسماء X للنطاق الحالي — استخدمها بحذر |
| using X::item; | يسحب عنصرًا واحدًا فقط — أكثر أمانًا |
💡 نصائح عملية
- لا تكتب using namespace std; داخل ملفات .h — يلوّث كل ملف يستورد الهيدر
- namespace متداخلة (namespace A::B { }) مفيدة لتنظيم مكتبات كبيرة بمشاريعك
⚠️ أخطاء شائعة
- using namespace std; بملف هيدر عام يسبب تعارضات أسماء صعبة التتبع بمشاريع كبيرة
- نسيان أن std::cout وstd::vector وغيرها كلها داخل namespace std
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.