שאלה לגבי using namespace std

הדלעת

New member
שאלה לגבי using namespace std

האם כדי להשתמש בספריות הסטנדרטיות ב-C++ חייבים להציין במפורש using namespace std (או std::) או שיש דרך לציין לקומפיילר שישתמש בניימספייס הזה עבור ה-main?
 

vinney

Well-known member
צריך לציין במפורש

שים שורה בheader העיקרי שלך, וזהו
 

annefan

New member
לא ולא!

לא שמים using namespace std בקבצי h!! בכל קובץ שמשתמש בספריה שאתה כותב, ומכליל אותו אתה מלכלך את ה-NS הגלובלי. לא חבל?
 

vinney

Well-known member
חבל, אבל פשוט ../images/Emo13.gif

אתה צודק, נתתי פתרון לעצלנים
 

selalerer

New member
אין דרך לבטל את הusing namespace כמ

ו:
not using namespace​
או משהו כזה? (בכדי שיהיה נוח לעשות קריאות מnamespace מסויים בheader)
 

hatulflezet

New member
יש בערך...

לעשות ממש ביטול - לזה אין טעם - כי מרחב השם בכל מקרה הוtא רק ביחידת הקוד בה הוא מוצהר - ואם אתה עושה זאת עם חשיבה מראש - אין סיבה לעשות ביטול. מה שכן - לפעמים יכול להיות שיש "הצלבה" - כלומר שני שמות של פונקציות או משתנים או טיפוס - שמופיעים בשני מרחבי שם, ואז מה שאתה עושה, את הקריאה אתה רושם עם מרחב שם מפורש - לדוגמא:
using namespace std; void foo() { myNameSpace::cout<<specialObject; //you own implementation of cout cout<<"std cout"<<endl; //the std::cout }​
 

hatulflezet

New member
למעשה

זה אמור להיות compilation unit אם אני זוכר נכון - שלצורך העניין - זה קובץ CPP.
 

הדלעת

New member
אם ככה, אז האם זה מספיק לשים אותו

בקובץ ה-main או שאני חייב לציין את זה בכל אחד מהקבצים בפרוייקט שלי? יש לי הרבה קוד ואני רוצה להימנע מהצורך לעדכן את כל הקבצים.
 

ברנדל

New member
אז תחליט

או שאתה מלכלך את כל הפרויקט ושם את זה ב header שמוכלל בהכל או שאתה צריך את זה רק לחלקים ספציפיים ואז אתה שם את זה רק במימוש של cpp ספציפיים. אם אתה טוען שגם ככה אתה משתמש בזה בכל מקום ומקום בתוכנית אז תעשה מה ש vinney אמר וזהו.
 

הדלעת

New member
גישה אחרת לבעיה - לחזור ל-gcc ישן

הבעיה הופיעה בעת שידרוג המערכת מ-RedHat 7.2 ל-RedHat 8.0 העידכון עידכן גם את הקומפיילר gcc לגירסה 3.2 שמחייבת שימוש בניימספייס. מדובר בפרוייקט גדול שלשנות את כל קבצי המקור שלו זו בעיה. האם ניתן בלינוקס RH8.0 להתקין את gcc בגירסה 2.96 (הגירסה הישנה) במקביל לגירסה 3.2 (הגירסה שבאה עם RH8.0) ולקמפל את הפרוייקט הזה בגירסה הישנה ופרוייקטים אחרים בחדשה, או שעלולים להיווצר קונפליקטים בין הגרסאות?
 

IP yuval

New member
בדביאן שלי יש 5 גרסות של gcc,

לכן אני מתאר לעצמי שאין בעיה גדולה להתקין gcc "ישן" גם ברד האט.
 

vinney

Well-known member
לא, הבעיה לא זאת

נכון שבGCC לפני 3 לא הייתה הבעיה, אבל הסיבה לכך היא שGCC 3 הותאם לסטנדרט של ++C שאומץ ב1999, ושכולל את הnamespace std. לפני כן באמת לא היית חייב את הnamespace. אם תמשיך לכתוב בGCC 2.96 בלי הstd, התוכנה שלך לא תתאים לתקן ++C.
 

הדלעת

New member
זה ברור, אבל הפרוייקט כבר קיים

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

vinney

Well-known member
לא זה לא. זה כדאי מאוד עד מומלץ, גם

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