کاربرد namespace در ++c - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

کاربرد namespace در ++c

+8 امتیاز
namespace در ++C چه کاربردی داره ؟؟

چرا واقعا نیازه که کد داخل namespace گذاشته بشه ؟
سوال شده مرداد 26, 1393  بوسیله ی رضا عاصفی (امتیاز 24)   1 3 3
دوباره باز شد مرداد 26, 1393 بوسیله ی Ali Rahbar
namespace کمک می‌کنه که مثلا چند تا identifier هم نام داشته باشیم. مثلا چند تا متغیر عمومی با اسم a بدون این که مشکلی پیدا بشه. namespace هم چنین در linkage تأثیر داره.
دوست عزیز پاسخت تقریبا درسته ولی درکل تنها یک Scope عمومی وجود داره .
هر namespace یک Scope جدید درست میکنه که زیر Scope همون Scope عمومی هست .
شما توی هر Scopeی نمیتونی بیشتر از یک Symbol داشته باشی .
برای همین namespace برای جدا کردن اینها بکار میاد .
سلام دوست عزیز
فضای نام یا namespace برای سازماندهی کدهای پروژه به کار میره
سلام ببخشید من متوجه این قسمت نشدم "شما توی هر Scopeی نمیتونی بیشتر از یک Symbol داشته باشی" منظورتون از symbol چیه؟
نامهای متغییر ها و توابع و شی ها رو که به کد نهایی تبدیل میشن رو بهش symbol میگن . مثلا تابع printf یک symbol هست که توی کتابخونه ی C وجود داره . یا مثلا شما تابعی رو به بیرون از کتابخونه ی خودتون صادر میکنید درواقع یک symbol رو صادر میکنید. و شما توی یک Scope نمیتونی ۲ تا متغییر همنام یا ۱ متغییر و ۱ تابع همنام داشته باشید.
ممنون. اما متوجه این قسمت جملتون نشدم " یا مثلا شما تابعی رو به بیرون از کتابخونه ی خودتون صادر میکنید " یعنی چی صادر کردن؟ میشه این قسمت رو واضح تر بگید
صادر کنید یعنی با استفاده از ( declspec(dllexport__ (در کامپایلر MSVC) یا __attribute__(visibility("default") (در کامپایلر  در GCC لینوکس) میتونید symbol ی که نوشتید رو در لیست symbol ها قرار بدید تا از خارج از چیزی که نوشتید بتونید به اون symbol دسترسی پیدا کنید .

1 پاسخ

+7 امتیاز
 
بهترین پاسخ

برای درک بهتر 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 استفاده کنین . 

پاسخ داده شده مرداد 26, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد مرداد 27, 1393 بوسیله ی Ali Rahbar
...