مساحة الاسم C ++

C Namespace



مساحة الاسم في C ++ هي نطاق عام. يبدأ إعلانها بالكلمة المحجوزة ، مساحة الاسم ، متبوعة باسم من اختيار المبرمج ، ثم الكتلة بين الأقواس. تحتوي الكتلة على إعلانات و / أو تعريفات أساسية لكائنات C ++ والوظائف والكيانات الأخرى.

ضع في اعتبارك العبارتين القياسيتين التاليتين في نطاق عالمي ، في البرنامج التالي:







#يشمل
استخدام اسم للمحطة؛

intفاريد= 5؛
تطفوفاريد= 2.3؛

intالأساسية()
{

إرجاع 0؛
}

تؤدي محاولة تجميع هذا البرنامج إلى حدوث خطأ في الترجمة. يوجد متغيرين بنفس الاسم ، فاريد . على الرغم من أنهما متغيرين مختلفين من نوعين مختلفين ، int و تطفو ، يرفض المترجم الإعلانين لأنهما يحملان نفس الاسم. البرنامج التالي يحل هذه المشكلة عن طريق التصريح عن المتغيرات التي تحمل نفس الاسم في نطاقين معممين مختلفين:



#يشمل
استخدام اسم للمحطة؛

مساحة الاسم NA
{
intفاريد= 5؛
}

مساحة الاسم NB
{
تطفوفاريد= 2.3؛
}

intالأساسية()
{
كلفة<<غير متوفر::فاريد << 'ن'؛
كلفة<<ملحوظة::فاريد << 'ن'؛

إرجاع 0؛
}

الإخراج كالتالي:



5
2.3

يوجد نوعان من مساحات الأسماء في البرنامج أعلاه: غير متوفر ، الذي يحتوي على تعريف عدد صحيح ، و ملحوظة ، الذي يحتوي على تعريف عدد عشري ولكن بنفس اسم العدد الصحيح لـ NA. أخيرًا ، عند تشغيل البرنامج ، تم استخدام نفس الاسم لمتغيرين مختلفين. لاحظ أنه للوصول إلى نفس الاسم لمتغيرين مختلفين ، يجب استخدام الاسم الخاص لمساحة الاسم متبوعًا بالمعرف المشترك. يتم فصل اسم مساحة الاسم والمعرف العام بواسطة عامل تحليل النطاق ، :: . سيختلف اسم مساحات الأسماء بين الكائنات.





تتناول هذه المقالة المفهوم الأساسي لمساحة الاسم واستخدامها في لغة البرمجة C ++. لمتابعة هذه المقالة ، يجب أن يكون لديك معرفة أساسية بلغة C ++. يجب أن يكون لديك أيضًا معرفة بنطاق C ++ ، على الرغم من أنه تم شرحه بإيجاز في هذه المقالة. لمعرفة المزيد حول نطاق C ++ ، ابحث عن العبارة ، Scope in C ++ (بدون علامات اقتباس) في مربع البحث في أي صفحة ويب linuxhint.com واضغط على Enter. سيقودك هذا إلى المقالة التي كتبها هذا المؤلف.

محتوى المادة

ما هو Namespace؟

المنطقة التعريفية هي الجزء الأكبر من البرنامج الذي يكون فيه اسم الكيان (المتغير) صالحًا. هذه المنطقة تسمى النطاق. مساحة الاسم في C ++ هي نطاق عام هدفه الرئيسي هو حل تعارض الأسماء. يحتوي مساحة الاسم على تعريفات أساسية و / أو تعريفات للكيانات.



مساحة الاسم العالمية ومشكلتها

مساحة الاسم العالمية هي النطاق العالمي. ضع في اعتبارك البرنامج القصير التالي:

#يشمل
استخدام اسم للمحطة؛

intالهوية= 55؛
تطفوالهوية= 12.17؛

intالأساسية()
{

إرجاع 0؛
}

في البرنامج أعلاه ، هناك متغيرين ، كلاهما يسمى الهوية . هذه المتغيرات في النطاق العالمي ؛ أي أنهم في مساحة الاسم العالمية. ستفشل محاولة ترجمة هذا البرنامج مع ظهور رسالة خطأ. لا يقبل النطاق العام أكثر من متغير واحد بنفس الاسم ، لذلك هناك حاجة إلى مساحة اسم مخصصة.

مساحة الاسم المخصصة

مساحة الاسم ليس لها اسم واحد فقط. بدلاً من ذلك ، تحتوي مساحة الاسم على مجموعة من الأسماء لتجنب التعارض مع مجموعات أخرى من الأسماء. لتجنب التعارض في أسفل الكود ، اسبق كل اسم باسم مساحة الاسم و :: . يوضح البرنامج التالي هذا باستخدام مساحتي أسماء مخصصتين:

#يشمل
استخدام اسم للمحطة؛

مساحة الاسم NA
{
intفارينت= 6؛
تطفوflt؛
}

مساحة الاسم NB
{
intفارينت= 7؛
تطفوflt؛
}

intالأساسية()
{
كلفة<<غير متوفر::فارينت << 'ن'؛
كلفة<<ملحوظة::فارينت << 'ن'؛
غير متوفر::flt = 2.5؛
ملحوظة::flt = 4.8؛
كلفة<<غير متوفر::flt << 'ن'؛
كلفة<<ملحوظة::flt << 'ن'؛

إرجاع 0؛
}

الخرج هو:

6
7
2.5
4.8

لاحظ أن الأسماء غير متاح :: flt و ملحوظة :: flt تم تعريفها في النهاية في الأساسية() وظيفة. C ++ لا تسمح بمثل هذا التعريف في النطاق العالمي.

لاحظ أن مساحة الاسم المخصصة هي مساحة اسم متداخلة لمساحة الاسم العمومية.

استخدام التوجيه

لتجنب كتابة namepace :: name طوال الوقت بدلاً من مجرد الاسم بعد التصريح عن مساحة الاسم ، يمكنك استخدام استخدام التوجيه. بناء الجملة لاستخدام استخدام التوجيه على النحو التالي:

باستخدام مساحة الاسم Namespace_name؛

ال استخدام التوجيه ليس توجيهًا للمعالج ، لذلك ينتهي بفاصلة منقوطة (؛).

يوضح البرنامج التالي استخدام ملف استخدام التوجيه وأكثر:

#يشمل
استخدام اسم للمحطة؛

مساحة الاسم NB
{
intفارينت= 7؛
intوظيفة()
{
إرجاعفارينت؛
}
}

intالجبهة الوطنية()
{
باستخدام مساحة الاسم NB؛
intmyVar2=وظيفة()؛
// كائنات ووظائف أخرى من ملحوظة: متابعة.
إرجاعmyVar2؛
}

intmyVar3=ملحوظة::وظيفة()؛

intالأساسية()
{
كلفة<<الجبهة الوطنية() << ' <<myVar3<< 'ن'؛

إرجاع 0؛
}

ناتج هذا البرنامج هو 7 7 . المصطلح باستخدام مساحة الاسم NB ؛ تم وضعه في بداية fn () تعريف. ال func () من NB اسم الهيكلة يسمى أسفل ذلك مباشرة ، دون أن يسبقه بـ ملحوظة :: .

يُنظر إلى المتغير المُعلن في النطاق العام (مساحة الاسم العالمية) من نقطة الإعلان إلى نهاية الملف. يمكن رؤيته أيضًا في مساحات الأسماء المتداخلة (النطاقات المتداخلة) ، مثل المجالات المتداخلة fn () نطاق الوظيفة أعلاه. ال استخدام يربط التوجيه مساحة الاسم الخاصة به من الموضع الذي يتم وضعه فيه إلى نهاية النطاق الذي يتم وضعه فيه.

الاسم func () من مساحة الاسم NB لا يمكن رؤيتها أسفل fn () التعريف بسبب باستخدام مساحة الاسم NB ؛ تم وضعه ضمن نطاق الوظيفة (الكتلة). تحت هذا الشرط ، للاستخدام func () خارج كتلة NB (النطاق) ، يجب أن يسبقه ملحوظة :: كما في البيان التالي:

intmyVar3=ملحوظة::وظيفة()؛

ال استخدام يربط التوجيه مساحة الاسم الخاصة به مع مساحة الاسم المتداخلة الخارجية من الموضع الذي يتم وضعه فيه إلى نهاية مساحة الاسم المتداخلة الخارجية. في البرنامج التالي ، يتم ربط مساحة الاسم NA بمساحة الاسم العالمية. ثم يمتد كلا النطاقات إلى امتداد fn () مساحة تعريف الوظيفة ، حيث يتم ربطها مع مساحة الاسم NB. تنتهي مساحة الاسم NB في نهاية ملف fn () تعريف الوظيفة ، وتستمر مساحتا الأسماء السابقتان حتى نهاية الملف (اقرأ من خلال الكود).

#يشمل
استخدام اسم للمحطة؛

مساحة الاسم NA
{
intفارينت= 6؛
intوظيفة()
{
إرجاعفارينت؛
}

}

مساحة الاسم NB
{
intفارينت= 7؛
intوظيفة()
{
إرجاعفارينت؛
}
}

باستخدام مساحة الاسم NA؛
intmyVar0=فارينت؛
// كائنات ووظائف أخرى من :: و ​​NB تتبع.

intالجبهة الوطنية()
{
intmyVar1=فارينت؛
باستخدام مساحة الاسم NB؛
intmyVar2=ملحوظة::وظيفة()؛
// تتبع الكائنات والوظائف الأخرى من NB ، حتى نهاية هذا النطاق.
إرجاعmyVar1+myVar2؛
}

// فقط الكائنات والوظائف من :: و ​​NB تتبع.

intmyVar3=ملحوظة::وظيفة()؛

intالأساسية()
{
كلفة<<myVar0<< ' <<الجبهة الوطنية() << ' <<myVar3<< 'ن'؛

إرجاع 0؛
}

الإخراج 6 ، 13 ، 7 .

ملحوظة: يشار إلى مساحة الاسم العالمية بالرمز :: ، مما يعني أنه لا يوجد شيء يتبع عامل تحليل النطاق.

أدناه البيان ، باستخدام مساحة الاسم NA ؛ يمكن استخدام المتغيرات من مساحات الأسماء العالمية و NA دون الإشارة إلى مساحة اسم المصدر الخاصة بها. البيان التالي يستخدم فارينت مساحة اسم زمالة المدمنين المجهولين. تمتد منطقة مساحة الاسم العالمية و NA المدمجة إلى fn () مساحة اسم الوظيفة. لذلك فارينت من البيان الأول في fn () نطاق الوظيفة ، من مساحة الاسم NA.

نظرًا لأن المنطقة الخاصة بالمساحات العالمية و NA تمتد في جميع أنحاء fn () النطاق ، بعد int myVar2 = NB :: func () ؛ ، لا يمكن استخدام أي اسم من مساحة الاسم NB إلا في ملف fn () النطاق دون أن يسبقه بـ ملحوظة :: ، فقط إذا لم يحدث في مساحات الأسماء (الكتل) العالمية والزمالة. خلاف ذلك ، يجب أن يسبقه ملحوظة :: . تستمر منطقة مساحات الأسماء المجمعة لزمالة المدمنين المجهولين والعالمية أسفل fn () تعريف و الأساسية() تعمل حتى نهاية الملف.

يبدأ امتداد مساحة الاسم NB من int myVar2 = NB :: func () ؛ في ال fn () بلوك وينتهي في نهاية fn () كتلة التعريف.

ملحوظة: يجب ألا يكون لمساحات الأسماء التي تم ضم مناطقها اسم المتغير نفسه في كتل مساحة الاسم المختلفة الخاصة بها ، حيث قد يتسبب ذلك في حدوث تعارض.

مناطق Namespace

مساحة الاسم هي نطاق. بصرف النظر عن مساحة الاسم العالمية (النطاق العالمي) ، يجب الإعلان عن أي مساحة اسم في كتلة. هذه الكتلة هي الجزء الأول من المناطق الموزعة المحتملة لمساحة الاسم. باستخدام التوجيه باستخدام ، يمكن توسيع مساحة الاسم كمناطق في نطاقات أخرى.

يُقال أن الكيانات المُعلن عنها في هيئة مساحة الاسم هي أعضاء في مساحة الاسم ، ويُقال إن الأسماء التي أدخلتها هذه الإعلانات في المنطقة التعريفية لمساحة الاسم هي أسماء أعضاء في مساحة الاسم.

مساحات الأسماء المتداخلة

يعرض البرنامج التالي مساحات الأسماء المتداخلة:

#يشمل
استخدام اسم للمحطة؛

مساحة الاسم أ
{
intأنا= 1؛
مساحة الاسم ب
{
intأنا= 2؛
مساحة الاسم C
{
intأنا= 3؛
}
}
}

intالأساسية()
{
كلفة<<إلى::أنا << ' <<إلى::ب::أنا << ' <<إلى::ب::ج::أنا << 'ن'؛

إرجاع 0؛
}

الخرج هو:

1 2 3

لاحظ أنه تم الوصول إلى القيم الثلاث باستخدام عامل تحليل النطاق.

مساحة الاسم القياسية

يحتوي C ++ على مكتبة تسمى المكتبة القياسية. أسماء الكائنات والوظائف والكيانات الأخرى في هذه المكتبة مأخوذة من مساحة اسم تسمى مساحة الاسم القياسية ، مكتوبة كـ ساعات . تحتوي المكتبة القياسية على مكتبات فرعية ، وإحدى هذه المكتبات الفرعية هي iostream . ال iostream مكتبة تحتوي على الكائن كلفة ، والتي تُستخدم لإرسال النتائج إلى وحدة التحكم (المحطة الطرفية).

الاسم كلفة يجب أن يكون في ساعات مساحة الاسم. ليستخدم iostream مع ل ساعات يجب أن يكون البرنامج كالتالي:

#يشمل
استخدام اسم للمحطة؛

لاحظ استخدام ملف استخدام التوجيه و ساعات . المصطلح #يشمل هو توجيه ما قبل المعالج ولا ينتهي بفاصلة منقوطة. يتضمن ملف iostream في موضع التوجيه الخاص به.

استنتاج

مساحة الاسم هي نطاق. يحتوي وصف مساحة الاسم (التعريف) على تعريفات أساسية و / أو تعريفات لكائنات C ++ والوظائف والكيانات الأخرى. خارج تعريف مساحة الاسم ، يمكن الوصول إلى الاسم من خلال بناء الجملة ، مساحة الاسم :: الاسم . بصرف النظر عن مساحة الاسم العالمية (النطاق العالمي) ، يجب الإعلان عن أي مساحة اسم في كتلة. هذه الكتلة هي الجزء الأول من المناطق الموزعة المحتملة لمساحة الاسم. مع ال استخدام التوجيه ، يمكن تمديد مساحة الاسم كمناطق في نطاقات أخرى. يجب ألا تحتوي مساحات الأسماء التي تم ضم مناطقها على نفس اسم المتغير في مجموعات مساحة الاسم المختلفة الخاصة بها ، لأن هذا قد يتسبب في حدوث تعارض في الأسماء.

كريس