c++ definition declaration

eyal the one

New member
c++ definition declaration

הי, כידוע declaration משמש ל type checking ונכלל בקובץ בו עושים שימוש בפונקציה או במשתנה , בתהליך משווה ה compiler את הקריאה למשתנה או לפונקציה מול ההצהרה. לעומת זאת definition משמש את הלינקר לקישור בין ההצהרה למקום האמיתי adress בו הפונקציה מוגדרת. מסיבה זו אין להגדיר את הפונקציה ביותר מ cpp אחד ואסור להגדיר אותה ב header שיכלל לאחר מכן במספר cpp. כי אז תהיה הגדרה כפולה, הצהרות, שאינן מהוות את הכתובת אלא רק משמשות ל type checking ניתן להגדיר בכל קובץ. אם כך:: למה לעזאזל ניתן להגדיא מחלקה ביותר ממקום אחד, איך הlinker מתמודד עם זה כידוע כאשר מכלילים ב header משהו כמו:
class a { int i; int x; public: void func(); }​
בעצם שמנו שם declaration + definition. אז אם יש שם definition שמקושר למעשה לכתובת ממשית ולא סתם הצהרה, איך זה שניתן להכליל את זה בהרבה cpp, בלי לחשוש מהגדרות כפולות אם היינו עושים אותו דבר לפונקציה או משתנה היינו מקבלים שגיאה מהקומפילר?? תודה מראש אייל
 

eyalbd

New member
הקוד שאתה נתת

הוא רק declaration. אין כאן definition. לכן אין בעיה לבצע include מכמה קבצי מקור מבלי שהלינקר יתלונן על כפילויות
 

eyal the one

New member
רגע...

עד כמה שאני יודע זה אומנם declaration עבור הפונקציות הפנימיות אבל זה definition עבור המחלקה עצמה (אחרת איפה הוא נעשה). חוץ מזה , ומה במקרה שאני נותן definition עבור הפונקציות הפנימיות בתוך ה class (בין הסוגריים המסולסלים, מה שהופך אותם ל inline) גם אז אין definition, הרי גם אז אני יכול להכליל את הקובץ כאוות נפשי. חוץ מזה שרשום בספרים הרציניים ( thinking c++ ) שמדובר ב declaration + definition, (שוב , זה גם הגיוני, כי אחרת אין שום definition בשום מקום אחר)
 
תשובה

קודם כל, מה שכתבת הוא DECALARATION בלבד, של *המחלקה* (על כל חלקיה). אם היית כותב מתודות INLINE, אזי יש INLINE DEFINITION, כלומר, אין התערבות של ה-LINKER. פונקציות INLINE (במידה והקומפיילר מחליט אכן לממש אותן כך) לא עוברות LINKAGE.
 

eyal the one

New member
תודה רבה רבה

והמשתנים עצמם אני מבין מקבלים הגדרה רק כאשר נוצר האוביקט? וחוץ מזה פונקציות שמוגדרות בתוך הסוגרים המסולסלים של המחלקה עם כל הקוד שלהם:
class a: { public: int func() { return 4; } };​
לא עוברות דרך ה LINKER?? גם אם הקומפילר החליט שלא לממש אותם באמצעות inline?
 
למעלה