מרחב שמות C ++

C Namespace



מרחב שמות ב- C ++ הוא היקף כללי. הכרזתו מתחילה במילה השמורה, מרחב השמות, ואחריה שם לפי בחירת המתכנת, ולאחר מכן הבלוק בסוגריים. הגוש מכיל הצהרות ו/או הגדרות בסיסיות של אובייקטים, פונקציות וישויות C ++.

שקול את שתי הצהרות הסקלריות הבאות בהיקף גלובלי, בתוכנית הבאה:







#לִכלוֹל
באמצעות מרחב שמות std;

intvarId= 5;
לָצוּףvarId= 2.3;

intרָאשִׁי()
{

לַחֲזוֹר 0;
}

ניסיון לאסוף תוכנית זו מוביל לשגיאת הידור. ישנם שני משתנים עם אותו שם, varId . למרות שהם שני משתנים שונים משני סוגים שונים, int ו לָצוּף , המהדר דוחה את שתי ההצהרות מכיוון שהן בעלות אותו שם. התוכנית הבאה פותרת בעיה זו על ידי הצהרת המשתנים עם אותו שם בשני היקפים כלליים שונים:



#לִכלוֹל
באמצעות מרחב שמות std;

מרחב שמות NA
{
intvarId= 5;
}

מרחב שמות NB
{
לָצוּףvarId= 2.3;
}

intרָאשִׁי()
{
עֲלוּת<<NA::varId << ' n';
עֲלוּת<<NB::varId << ' n';

לַחֲזוֹר 0;
}

הפלט הוא כדלקמן:



5
2.3

בתוכנית לעיל ישנם שני מרחבי שמות: NA , שיש לו את ההגדרה של מספר שלם, ו- NB , שיש לו את ההגדרה מצוף אך בעל אותו שם כמו המספר השלם של NA. לבסוף, כשהתוכנית הופעלה, נעשה שימוש באותו שם לשני משתנים שונים. שים לב שכדי לגשת לאותו שם של שני משתנים שונים, יש להשתמש בשם הספציפי של מרחב השמות, ואחריו המזהה הנפוץ. שם מרחב השמות והמזהה הנפוץ מופרדים על ידי מפעיל רזולוציית ההיקפים, :: . שם מרחבי השמות יבדיל את האובייקטים.





מאמר זה עוסק ברעיון הבסיסי של מרחב שמות והשימוש בו בשפת התכנות C ++. כדי לעקוב אחר מאמר זה, עליך להיות בעל ידע בסיסי בשפת C ++. עליך להיות בעל ידע גם על היקף C ++, אם כי הוא מוסבר בקצרה במאמר זה. למידע נוסף על היקף C ++, חפש את הביטוי, היקף ב- C ++ (ללא ציטוטים) בתיבת החיפוש של כל דף אינטרנט של linuxhint.com ולחץ על Enter. זה יוביל אותך למאמר שכתב המחבר הזה.

תוכן המאמר

מהו מרחב שמות?

אזור הצהרתי הוא החלק הגדול ביותר של תוכנית שבה שם הישות (משתנה) תקף. אזור זה נקרא היקף. מרחב שמות ב- C ++ הוא היקף כללי שמטרתו העיקרית היא לפתור התנגשויות שמות. למרחב שמות יש הצהרות ו/או הגדרות בסיסיות של ישויות.



מרחב השמות העולמי והבעיה שלו

מרחב השמות העולמי הוא ההיקף הגלובלי. שקול את התוכנית הקצרה הבאה:

#לִכלוֹל
באמצעות מרחב שמות std;

intזהות= 55;
לָצוּףזהות= 12.17;

intרָאשִׁי()
{

לַחֲזוֹר 0;
}

בתוכנית לעיל, ישנם שני משתנים, שניהם נקראים זהות . משתנים אלה נמצאים בהיקף הגלובלי; כלומר, הם נמצאים במרחב השמות העולמי. ניסיון לאסוף תוכנית זו ייכשל עם הודעת שגיאה. ההיקף הגלובלי אינו מקבל יותר ממשתנה אחד עם אותו שם, ולכן יש צורך במרחב שמות מותאם אישית.

מרחב שמות מותאם אישית

למרחב שמות אין רק שם אחד. במקום זאת, למרחב שמות יש קבוצת שמות כדי למנוע התנגשות עם קבוצות שמות אחרות. כדי להימנע מעימות נמוך יותר בקוד, הקדימו לכל שם את שם מרחב השמות ו- :: . התוכנית הבאה ממחישה זאת באמצעות שני מרחבי שמות מותאמים אישית:

#לִכלוֹל
באמצעות מרחב שמות std;

מרחב שמות NA
{
intvarInt= 6;
לָצוּףflt;
}

מרחב שמות NB
{
intvarInt= 7;
לָצוּףflt;
}

intרָאשִׁי()
{
עֲלוּת<<NA::varInt << ' n';
עֲלוּת<<NB::varInt << ' n';
NA::flt = 2.5;
NB::flt = 4.8;
עֲלוּת<<NA::flt << ' n';
עֲלוּת<<NB::flt << ' n';

לַחֲזוֹר 0;
}

הפלט הוא:

6
7
2.5
4.8

שימו לב כי השמות NA :: flt ו NB :: flt הוגדרו בסופו של דבר ב- רָאשִׁי() פוּנקצִיָה. C ++ אינו מאפשר הגדרה כזו בהיקף הגלובלי.

שים לב שמרחב השמות המותאם אישית הוא מרחב שמות מקונן עבור מרחב השמות הגלובלי.

הוראת השימוש

כדי להימנע מהקלדת שם שם :: שם כל הזמן במקום רק שם לאחר הכרזת מרחב השמות, תוכל להשתמש ב באמצעות הוֹרָאָה. התחביר לשימוש ב- באמצעות ההנחיה היא כדלקמן:

באמצעות מרחב שמות שם שם;

ה באמצעות הנחיה היא לא הנחיה מקדימה, ולכן היא מסתיימת בפסיק (;).

התוכנית הבאה ממחישה את השימוש ב- באמצעות הנחיה ועוד:

#לִכלוֹל
באמצעות מרחב שמות std;

מרחב שמות NB
{
intvarInt= 7;
intפוּנקצִיָה()
{
לַחֲזוֹרvarInt;
}
}

intfn()
{
באמצעות מרחב שמות NB;
intmyVar2=פוּנקצִיָה();
// אובייקטים ופונקציות אחרים מ- NB עוקבים.
לַחֲזוֹרmyVar2;
}

intmyVar3=NB::פוּנקצִיָה();

intרָאשִׁי()
{
עֲלוּת<<fn() << '' <<myVar3<< ' n';

לַחֲזוֹר 0;
}

הפלט של תוכנית זו הוא 7 7 . התנאי שימוש במרחב שמות NB; הוצב בתחילת fn () הַגדָרָה. ה func () ממרחב השמות NB נקרא ממש מתחת לזה, מבלי להקדים עם הערה :: .

משתנה המוצהר בהיקף הגלובלי (מרחב שמות גלובלי) נראה מנקודת ההצהרה ועד סוף הקובץ. הוא נראה גם במרחבי השמות המקוננים (היקפים מקוננים), כגון המקוננים fn () היקף הפונקציות למעלה. ה באמצעות ההנחיה מצטרפת למרחב השמות שלה מהמיקום שבו היא ממוקמת עד סוף ההיקף שבו היא ממוקמת.

השם func () ממרחב השמות NB לא ניתן לראות מתחת ל- fn () הגדרה כי שימוש במרחב שמות NB; הונח בגדר הפונקציה (בלוק). בתנאי זה, לשימוש func () מחוץ לגוש מרחב השמות של NB (היקף), יש להקדים אותו הערה :: , כמו בהצהרה הבאה:

intmyVar3=NB::פוּנקצִיָה();

ה באמצעות ההנחיה מצטרפת למרחב השמות שלה עם מרחב השמות החיצוני של הקינון מהמיקום שבו הוא ממוקם עד לסוף מרחב השמות החיצוני של הקינון. בתוכנית הבאה, מרחב השמות NA מצטרף למרחב השמות העולמי. שני מרחבי השמות משתרעים עד לתוך fn () מרחב שמות הגדרת פונקציות, שבו הם מחוברים למרחב השמות של NB. מרחב השמות של NB מסתיים בסוף ה- fn () הגדרת הפונקציה ושני מרחבי השמות הקודמים נמשכים עד סוף הקובץ (קרא את הקוד).

#לִכלוֹל
באמצעות מרחב שמות std;

מרחב שמות NA
{
intvarInt= 6;
intפוּנקצִיָה()
{
לַחֲזוֹרvarInt;
}

}

מרחב שמות NB
{
intvarInt= 7;
intפוּנקצִיָה()
{
לַחֲזוֹרvarInt;
}
}

באמצעות מרחב שמות NA;
intmyVar0=varInt;
// אובייקטים ופונקציות אחרים מ- :: ו- NB עוקבים.

intfn()
{
intmyVar1=varInt;
באמצעות מרחב שמות NB;
intmyVar2=NB::פוּנקצִיָה();
// אובייקטים ופונקציות אחרים מ- NB עוקבים עד לסוף היקף זה.
לַחֲזוֹרmyVar1+myVar2;
}

// רק אובייקטים ופונקציות מ- :: ו- NB עוקבים.

intmyVar3=NB::פוּנקצִיָה();

intרָאשִׁי()
{
עֲלוּת<<myVar0<< '' <<fn() << '' <<myVar3<< ' n';

לַחֲזוֹר 0;
}

הפלט הוא 6, 13, 7 .

הערה: מרחב השמות הגלובלי מסומן עם :: , כלומר אין דבר לפני מפעיל רזולוציית ההיקף הבא.

מתחת להצהרה, ה- שימוש במרחב שמות NA; ניתן להשתמש במשתנים ממרחבי השמות העולמיים ו- NA ללא ציון מרחב שמות המקור שלהם. ההצהרה הבאה משתמשת ב- varInt של מרחב השמות של NA. אזור מרחב השמות העולמי ו- NA משתרע על פני fn () מרחב שמות פונקציות. אז ה varInt מההצהרה הראשונה ב fn () היקף הפונקציות, הוא של מרחב השמות NA.

מכיוון שהאזור למרחבי השמות העולמיים וה- NA משתרע על פני כל fn () היקף, לאחר int myVar2 = NB :: func (); , ניתן להשתמש בכל שם ממרחב השמות NB רק ב- fn () היקף מבלי להקדים אותו עם הערה :: , רק אם זה לא קרה ב- NA ובמרחבי השמות העולמיים (בלוקים). אחרת, יש להקדים אותו הערה :: . האזור של מרחבי השמות המשולבים של NA והעולם נמשך מתחת ל fn () הגדרה ולתוך רָאשִׁי() פונקציה עד סוף הקובץ.

הרחבה של מרחב השמות NB מתחילה מ int myVar2 = NB :: func (); בתוך ה fn () לחסום ומסתיים בסוף ה fn () בלוק הגדרה.

הערה: מרחבי שמות שאזוריהם מחוברים לא אמורים לכלול את אותו שם המשתנה בלוקים השונים של מרחב השמות שלהם, מכיוון שזה עדיין יגרום להתנגשות.

אזורי מרחב שמות

מרחב שמות הוא היקף. מלבד מרחב השמות העולמי (היקף גלובלי), יש להכריז על כל מרחב שמות בבלוק. בלוק זה הוא החלק הראשון של האזורים המופצים של מרחב השמות. בעזרת הנחיית השימוש, ניתן להרחיב את מרחב השמות כאזורים בהיקפים אחרים.

נאמר כי ישויות המוצהרות בגוף מרחב שמות הן חברות במרחב השמות, ושמות שהוכנסו על ידי הצהרות אלה לאזור ההצהרתי של מרחב השמות אומרות שהן שמות חברים של מרחב השמות.

מרחבי שמות מקוננים

התוכנית הבאה מציגה מרחבי שמות מקוננים:

#לִכלוֹל
באמצעות מרחב שמות std;

מרחב שמות א
{
intאני= 1;
מרחב שמות ב
{
intאני= 2;
מרחב שמות C
{
intאני= 3;
}
}
}

intרָאשִׁי()
{
עֲלוּת<<ל::אני << '' <<ל::ב::אני << '' <<ל::ב::ג::אני << ' n';

לַחֲזוֹר 0;
}

הפלט הוא:

1 2 3

שים לב כי ניתן לגשת לשלושת הערכים באמצעות מפעיל רזולוציית ההיקפים.

מרחב שמות רגיל

ל- C ++ יש ספרייה בשם הספרייה הסטנדרטית. שמות האובייקטים, הפונקציות וגופים אחרים בספרייה זו הם ממרחב שמות הנקרא מרחב שמות סטנדרטי, כתוב בשם שעה (ות . הספרייה הסטנדרטית מכילה תת-ספריות, ואחת מספריות המשנה האלה היא iostream . ה iostream הספרייה מכילה את האובייקט עֲלוּת , המשמש לשליחת תוצאות לקונסולה (מסוף).

השם עֲלוּת חייב להיות ב שעה (ות מרחב שמות. להשתמש iostream עם שלה שעה (ות מרחב השמות, התוכנית צריכה להיות כדלקמן:

#לִכלוֹל
באמצעות מרחב שמות std;

שימו לב לשימוש ב- באמצעות הנחיה ו שעה (ות . התנאי #לִכלוֹל הוא הנחיית קדם -מעבד ואינו מסתיים בפסיק. הוא כולל את קובץ iostream במיקום ההנחיה שלו.

סיכום

מרחב שמות הוא היקף. תיאור מרחב השמות (הגדרה) מכיל הצהרות בסיסיות ו/או הגדרות של אובייקטים, פונקציות וישויות C ++. מחוץ להגדרת מרחב השמות, ניתן לגשת לשם באמצעות התחביר, namespaceName :: name . מלבד מרחב השמות העולמי (היקף גלובלי), יש להכריז על כל מרחב שמות בבלוק. בלוק זה הוא החלק הראשון של האזורים המופצים של מרחב השמות. עם ה באמצעות ההנחיה, ניתן להרחיב את מרחב השמות כאזורים בהיקפים אחרים. למרחבי שמות שאזוריהם מחוברים לא צריך להיות אותו שם משתנה בחסימות מרחב השמות השונים שלהם, מכיוון שזה עדיין יגרום להתנגשות שמות.

כריס