משתנים גלובלים ב ++C

ilankt

New member
משתנים גלובלים ב ++C

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

HaRmosh

New member
אם הכוונה שלך הייתה איך למנוע את

הכללת הקובץ משכמה מקומות, אתה יכול לנסות בתחילתו לשים:
#ifndef __FILENAME #define __FILENAME​
ובסופו לשים:
#endif​
זה אמור לפתור את הבעיה, בהנחה שהבנתי אותה נכון
 

ברנדל

New member
תשובה

הוא לא נותן שגיאה של המהדר הוא נותן שגיאה של ה linker, שאומרת שה linker מצא את אותו משתנה יותר מפעם אחת. שים לב שהמהדר הוא בעל תמונה ספציפית של קובץ ולכן לא יכול להתריע על טעות כזו ואילו הלינקר הוא בעל תמונה גלובלית. משתנה גלובלי הוא בעל external linkage מה שאומר שמותר לו להיות מוגדר בדיוק פעם אחת בתוכנית. ברגע שאתה שם אותו ב header ומכליל את ה header בקבצים אחרים אז ה header הופך להיות חלק קוד של קבצי cpp שונים שהוא מוכלל בהם, ולכן ה linker מוצא את המשתנה יותר מפעם אחת בתוכנית. אסור להגדיר משתנה גלובלי ב header. שים את המשתנה בקובץ cpp ועל מנת להכליל אותו בקבצים שונים , תצהיר עליו בלבד ב header ע"י
extern int i;​
לדוגמא. בהצלחה
 

gilad_no

New member
__declspec(selectany)

אם אתה עובד עם VC, שים את זה לפני הגדרת המשתנה:
__declspec(selectany) int test=5;​
אם זה בסביבה אחרת, תצהיר על המשתנה בHEADER (עם EXTERN) ותגדיר אותו בקובץ CPP יחיד.
 

ilankt

New member
התכוונתי בלהגדיר לא לעשות לו =int x

אלא ל int x;
 

eyalbd

New member
עצה לא טובה

כי היא לא פורטבילית. תמיד עדיף extern עם הגדרה באחד מקבצי המקור. זה טוב לכל הסביבות.
 

gilad_no

New member
כבר אמרתי,

אם הוא עובד עם חלונות, אין עם זה בעיה. אם הוא צריך קוד פורטבילי - שיעבוד עם EXTERN. אני כותב הרבה הרחבות לWTL (שגם ככה זה רק לחלונות) וכך אני יכול לשים הכל בקובץ H במקום ליצור גם קבצי CPP ולדאוג להכליל אותם בפרוייקט. זה פשוט הרבה יותר נוח.
 
למעלה