unix

unix

הי, אני כותב קוד C ב-UNIX. בניתי header ושני קבצי source אחד ל-main ואחד func אני רוצה להגדיר משתנה גלובלי שיוכר גם ב-Main וגם ב-func משום מה כשאני כותב ב-header: extern int xx =10; הוא מודיע על הגדרה מרובה של משתנה xx (והוא מוגדר רק פעם אחת... מודיע את אותה הודעה אם אני משנה ל-yy). תודה מראש על התשובות
 

MotiAd

New member
הבעייה היא אחרת בכלל...

אתה מגדיר משתנה שבעצם קיים בקובץ אחר (זאת משמעות ה-extern). מה שאתה צריך לעשות זה פשוט להגדיר משתנה ב-header ושני קבצי המימוש יוכלו לגשת אליו.
 

annefan

New member
הצהרה והגדרה

כשאתה כותב:
extern int xx = 10;​
אתה עושה שני דברים. מצהיר על משתנה (declaration) והגדרה שלו )definition). אתה עושה את זה בקובץ שמוכלל ע"י שני קבצים ע"י ה-pre-processor, כלומר בכל אחד מהקבצים שמכלילים את קובץ ה-h, מופיעה השורה שמגדירה את המשתנה xx. הקומפילציה עוברת בסדר, רק שהלינקר מקבל שני קבצים שבכל אחד מהם מופיע אותו משתנה בדיוק! מה שאתה צריך זה להצהיר עליו בכל מקום שאתה צריך אותו:
extern int xx;​
אבל להגדיר אותו רק במקום אחד:
int xx = 10;​
שים לב! הגדרה בקובץ h, היא למעשה הגדרה בכל קובץ שמכליל אותו, ולא רק בקובץ אחד! לכן, אתה יכול לשים את ההצהרה בקובץ h, ואת ההגדרה באחד הקבצים. הקומפילציה לא תמצא את xx בקובץ עצמו, אבל כיוון שהצהרת עליו כ-extern, הוא לא יפסיק קומפילציה, ויחכה ללינקר שימצא את xx במקום אחר.
 
למעלה