עבור לתוכן

מה ההבדל בין USING ל INCLUDE - בC++

Featured Replies

פורסם

טוב אני צריך ללמוד C++ בשבועיים בערך, פחות או יותר לעמוק.

אני מניח מאחר שאני יודע C וJAVA לא יהיה לי הכי קשה אחרי הבנה לעומק של הסינטק, אבל צפו להרבה שאלות בשבועיים הקרובים D=.

ולשאלה, ראיתי בקוד ממש קצר את שני אלה ולפי ההסבר הם נשמעו לי זההים בתפקידם.

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

וגם אפשר לרשום אחרי USING עוד ביטויים מלבד NAMESPACE?

עריכהף

אשמח להסבר קצר בקשר למשתנה מסוג wchar_t

פורסם

USING:

USING X אומר שאתה משתמש במערכת TYPES X.

אם למשל מוגדר אצלך STRING אתה צריך דרך להבדיל בינו לבין STRING המובנה.

std::string הסטרינג של STD.

INCLUDE:

אמרת שאתה יודע C אז זה נורא פשוט

הקומפילר פשוט מעתיק את הקוד מהקובץ שותו צירפת, תחשוב על זה כאילו שהקוד של הקובץ אותו אתה מייבא אליך נמצא באותו הקובץ.

פורסם
  • מחבר

הUSING לא מובן, הINCLUDE מובן וידוע.

אם לא חידדתי את העיניין מדובר על USING NAMESPACE , כנראה שיש עוד לפי מה שרשמת.

פורסם

אני אנסה לחדד את ההסבר הקודם.

נצא מנקודת הנחה שמישהו כתב מחלקה string במקום מסויים באחד מקבצי הH שאתה מוסיף לפרוייקט.

נניח לרגע שבא לך לכתוב בדיוק מחלקה בשם string שעושה לא יודע מה, מפוצצת את המחשב.

איך המחשב ידע לאיזה מחלקת string אתה מבקש לגשת?

הפתרון זה "לעטוף" את המחלקה string שלך בnamespace.

כאשר אתה מגדיר using namespace BlowTheWorld, המחשב יודע לגשת למחלקת string שלך ולא למחלקה שמומשה במקום אחר בiostream או משהו כזה (סתם זרקתי שם של קובץ H).

פורסם
  • מחבר

זאת אומרת שאם יש אובייקט/פוקציה/משהו אחר זהים גם בNAMESPACE וגם בINCLUDE (קבצים שונים כמובן)

הוא יקח כברירת מחדל את המחלקה שרשמנו בNAMESPACE, הבנתי נכון? (זה אומר שיש למשל CIN גם בIOSTREAM וגם בSTD, נכון?)

פורסם

אין namespace בשם iostream.

הקובץ iostream מגדיר כל מיני קלאסים, כולם תחת ה-namespace שנקרא std.

נניח שמוגדר משהו כזה:

namespace X
{
class A
{
// some code
};

class B
{
// some code
};
}

אז יש שתי דרכים להתייחס לקלאסים הללו - או באמצעות גישה ישירה - X::A ו-X::B, או לחילופין לרשום using namespace X, ואז אפשר להתייחס ישירות ל-A ול-B (עדיין אפשר להתייחס אליהם בתור X::A ו-X::B).

עכשיו - נניח שמוגדרים שני namespace בשם X ו-Y, שכל אחד מהם מגדיר קלאס משלו בשם A - אז אין קשר בין הקלאסים X::A ו-Y::A (אלה שני קלאסים שונים). אם עושים using לשני ה-namespaceים, אז התייחסות ל-A כנראה תגרור שגיאת קומפילציה (נראה לי שזה תלוי קומפיילר), וצריך להתיחס ל-A באמצעות ה-namespace כנ"ל.

שים לב להבדל - include היא פקודה ל-preprocessor, שכל מה שהיא עושה זה להדביק את הקובץ הנכלל בתוך הקובץ הנוכחי, בלי לשנות בו כלום. using היא פקודה לקומפיילר, שאומרת לו איך לאיזה שמות להתייחס וכיצד. אין שום קשר בין שתי הפקודות למעשה.

פורסם
  • מחבר

אז NAMESPACE לא מוסיף לקוד? (כמו IMPORT בJAVA?)

ובקשר לIOSTREAM אם הוא כולל בתוכו CIN למה צריך לרשום STD::CIN אם לא עשית NAMSPACE לSTD?

מה בקשר ל

אשמח להסבר קצר בקשר למשתנה מסוג wchar_t
פורסם

אתה לא יכול ללמוד C++ לעומק בשבועיים. אתה (אולי) יכול ללמוד (חלקים מ-) C++ באופן שטחי בשבועיים.

http://norvig.com/21-days.html

בקצרה:

כל מה שאתה מגדיר ב-C (או C++ וברוב השפות) נקרא identifier, או מזהה.

namespace הוא מכניזם שקיים ב-C++ אשר מאפשר ליצור היררכיה של מזההים, וזה מאפשר למזהים בעלי שם זהה להתקיים זה לצד זה.

ב-using יש כמה שימושים, ובגדול כאשר אתה עושה משהו כמו using namesapce std; אתה למעשה מייבא את כל המזהים ב-std (שהוא namspace) אל תוך ה-namespace שאתה נמצא בו. אם לא ציינת אחד במפורש, אז כל מה שאתה מגדיר נמצע ב-global namespace.

http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5

פורסם
  • מחבר

אז כשאתה עושה INCLUDE לקובץ כלשהו של C++ הוא מוסיף את הקוד אבל בNAMESPACE אחר?

כאילו משהו כזה(אחרי פעולת PREPROCECOR)


namespace x{
#include <iostream>

code...
}

namespace std{
iostream classes...
}

בקשר ללמוד לעומק אין לי ממש ברירה, די הנחיתו את זה עלי, המטרה שלי כרגע היא לעבוד על סינטק ולעבור ישר למחלקות, OOP וכל מה שמסביב לעומק

פורסם

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

#include של C++ זהה לחלוטין ל-#include של C, (השפה הזו שאתה טוען שאתה מכיר).

מה שהופך את תוכן iostream להיות בתוך std זה העובדה שהוא מכיל קוד מסוג זה:


namespace std
{
// bla bla bla
}

פורסם
  • מחבר

ללמוד לעומק לא אומר מבחינתי לשלוט בזה, או בכלל קרוב לזה.

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

זה מה שרשמתי לא? כל עוד לא עושים USING NAMESPACE לאותה NAMESPACE שעוטפת את IOSTREAM(או כל קובץ אחר) הקוד שרשמתי והקוד שצירפתי נמצא בשני NAMESPACE שונים, נכון?

פורסם

מה שאתה אומר פשוט לא מדוייק. הוא נכון רק במקרה של iostream או דברים אחרים מה-standard library.

מה שנכון לומר זה שכל מה שבספריה הסטנדרטית נמצא ב-std.

פורסם

אני מציע לך לקרוא כמה עמודים מהספר

thinking in c++

יש אותו חינם בWEB יש שם בדיוק הסבר של NAMESPACE ולמה בכלל צריך אותו (בעיקר בפרויקטים גדולים), מה היו הבעיות ב C שנפתרו בC++ ועוד.

פורסם
  • מחבר

אוקי, תודה. אני יעבור על זה עכשיו.

ארכיון

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

דיונים חדשים