برای درک بهتر namespace فکر می کنم داشتن اطلاعاتی در مورد Scope لازم باشه .
Scope : به بزرگترین فضایی از کد که داخلش استفاده از یک اسم خاص مجاز هست scope گفته میشه .
scope های متفاوتی وجود داره :
1_ بلاک بین {} : اسمی که داخل این بلاک و بعد از { تعریف بشه فقط از محل تعریف تا رسیدن به } قابل استفادست
2_ scope توابع : اسمی که داخل تعریف یا بدنه توابع تعریف میشه تا رسیدن به آخر تابع و فقط داخل همون تابع قابل استفادست .
void foo(int a){
int b;
}//a va b ta inja ghabele estefade hastan
3_scope کلاس ها : اسم هایی که داخل کلاس تعریف میشن داخل تمام توابع عضو کلاس قابل استفاده هستن و بسته به public , protected , private بودن میتونن خارج از کلاس هم استفاده بشن.
4_ scope مربوط به namespace : اسم هایی هم که داخل namespace تعریف میشن بصورت پیش فرض فقط داخل خود namespace قابل استفاده هستن ولی میشه داخل بقیه scope های برنامه هم ازشون استفاده کرد .
4 نوع namespace متفاوت وجود داره :
-
1_ Global namespace : به فضای خارج از scope های بالا و سه namespace بعدی گفته میشه. . هر translatation unit (یا source file ) برنامه یک فضای عمومی (global namespace ) مخصوص به خودش رو داره . متغیری که داخل این فضا تعریف بشه بهش global variable یا متغیر خارجی میگن . اسم هایی که داخل این فضا تعریف بشن داخل همه ی scope های translation unit مربوطه قابل استفاده هستن .
-
2_ unname namespace : داخل این لینک در موردش توضیح داده شده : namespace بدون نام
-
3_ namespace ای که اسم داره و برنامه نویس مشخص می کنه :اسم های داخل این فضا علاوه بر محدوده خود namespace در محل هایی که از using هم استفاده شده قابل استفاده هستن(البته به غیر از using از :: هم میشه استفاده کرد ) مهمترین کاربرد هم که این نوع namespace داره اینه که اسم های مشابه رو میشه داخل namespace های جداگانه تعریف کرد . مثلا تابع find رو در نظر بگیرید اگر namespace نبود هیچ کتابخانه ای نمیتونست از این اسم استفاده کنه چون داخل STL تعریف شده ولی الان چون هر کتابخانه میتونه از namespace خودش استفاده کنه میتونن از این اسم هم استفاده کنن .استفاده از namespace به خوانایی کد هم کمک می کنه .
-
4_inline namespace : این فضا مربوط میشه به کسانی که کتابخانه مینویسن . نحوه استفاده هم به این شکله که داخل یک namespace یکسری namespace دیگه مربوط به هر ورژن جداگانه میسازین (inner namespace ) و جدید ترینش رو قبلش inline میگزارید . که جایگزین خوبی برای ifdef میتونه باشه .
پس در مجموع میشه گفت هر وقت که نیاز داشتید که یک scope جدا داشته باشید و اسم هایی که تعریف کردید با کتابخانه های دیگه تداخل نداشته باشن باید از namespace استفاده کنین .