close
دانلود فیلم
فضای اسمی

فضای اسمی

وقتی يک برنامه به اندازه معينی می رسد معمولا به چند قطعه شکسته می شود، هر تکه ممکن است توسط افراد يا گروه متفاوتی ساخته و تکميل شود. زبان C تنها يک مکان برای نگهداری اسامی کليه شناسه ها و توابع دارد. يعنی برنامه نويسان بايد درباره نامگذاری اسامی محتاط باشند تا برخوردی پيش نيايد.

++C مکانيسمی برای جلوگيری از اين تصادم دارد: فضای اسمی (namespace). هر مجموعه از تعاريف که در يک کتابخانه يا يک برنامه قرار دارند درون يک فضای اسمی مجزا جا می گيرند. اعلان اسامی مشابه در فضاهای اسمی متفاوت هيچ برخوردی پيش نمی آورد.

فضای اسمی ناحيه ای است که يک شناسه اضافی را به اسامی عناصر درون خود الحاق می کند. هر نام بدليل اضافه شدن شناسه فضای اسمی منحصر بفرد خواهد شد. بنابراين می توان اسامی مشابه در فضاهای اسمی متفاوت حتی در يک فايل داشت. مادامی که اسامی مشابه در فضاهای اسمی مجزا هستند مشکلی در برنامه بروز نمی کند.

کلمه کليدی namespace يک نام منحصربفرد را برای يک فضای اسمی تعريف می کند. شکل کلی تعريف فضای اسمی به صورت زير است:

namespace identifier
{
   [ declaration-list ]
}

identifier شناسه فضای اسمی است که برای ارجاع به اعضای آن استفاده می شود. declaration-list اعضای فضای اسمی هستند که حتما بايد درون آکولاد محصور شوند. اعضا می تواند شامل اعلان متغير، تابع، اشيا و فضای اسمی باشد.

به نام هرکدام از اعضا شناسه فضای اسمی توسط عملگر حوزه (::) اضافه می شود.

مثال. دو متغير x در دو فضای اسمی. يکی one::x و ديگری two::x خواهد شد.


namespace one {
   int x;
}
namespace two {
   float x;
}
int main() {
   one::x++;
}


نکته. شناسه فضای اسمی در واحدی که استفاده می شود بايد يکتا باشد.
نکته. اعلان فضاهای اسمی می توانند تودرتو باشند.
نکته. عملگر حوزه (::) که قبل از آن شناسه ای نباشد به ناحيه سراسری اشاره می کند.


مثال. فضای اسمی B درون A تعريف شده است.

int i;
namespace A {
   int j;
   namespace B {
      int j, k;
   }
}
int main() {
   A::j++;        //A's j
   A::B::j++;   // B's j
   ::i++;          // the global i
}


می توانيد از فضای اسمی بدون شناسه به عنوان راهی برای اعلان متغيرهای ايستای سراسری بهره ببريد. فضای اسمی بدون نام شکل کلی زير را دارد.

namespace { declaration-list }

که در حقيقت مثل اين است که به صورت زير تعريف شده باشد.

namespace unique { declaration-list }
using namespace unique;

برخلاف نواحی تعريفی ديگر تعريف يک فضای اسمی می تواند در چندين قسمت درون يک واحد (مانند فايل) تقسيم شود. البته اعضای يک فضای اسمی شناسه دار می توانند در خارج از آن تعريف شوند به شرطی که بعد از تعريف فضای اسمی قرار بگيرد.


مثال. تعريف اعضای فضای اسمی در دو قسمت.

namespace A { // declare namespace A variables
   int i;
   int j;
}
namespace A { // declare namespace A functions
   void func(void);
   int int_func(int i);
}

مثال. توابع f() و g() متعلق به فضای اسمی V هستند که خارج از ان تعريف شده اند.

namespace X { void f() { } }
namespace V {
   void f();
}
void V::f() { }   // ok
void V::g() { }   // g() is not yet a member of V
namespace V {
   void g();
}

به کانال تلگرام سایت ما بپیوندید