משתנה גלובלי בC

elStudent

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

1. אם יש לי תכנית מרובת קבצים ואני מגדירה משתנה כלשהו במילה extern אז כל הקבצים בפרויקט אמורים להכיר את המשתנה?
2. אם אני מגדירה משתנה מסוים באחד הקבצים, בלי extern אלא "סתם" ככה בקוד- לא בתוך פונקציה, מי מכיר את המשתנה הזה-
הפונקציות שבתוך הקובץ? הקבצים האחרים יכירו את המשתנה אם אני אעשה include?
 

vinney

Well-known member
תשובות

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

2. הפונקציות שבאות אחרי המשתנה בסדר הקריאה. אם תעשי לו include - אז כל מה שבא אחרי הinclude.

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

elStudent

New member
רק בלבלת אותי יותר:)

נניח שיש לי משתנה int global1 ואני רוצה להשתמש בו גם בקובץ A.c וגם בקובץ B.c (שני הקבצים הם חלק מתוכנית) אז מה הכי טוב לעשות במקרה כזה?
 
ככה

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

(אם יש header שמוכלל בקבצי התוכנית, מומלץ לעשות בו את ה-extern)
 

selalerer

New member
נתחיל עם הסבר על קומפלציה וה-precompiler.

הקומפיילר מקמפל קובץ אחד של c כל פעם (אחרי זה ה-linker מחבר אותם).

לפני שהוא מקמפל קובץ הוא מריץ את ה-precompiler. הוא מטפל בכל השורות שמתחילות ב-#.

כשיש include# ה-precompiler פשוט קורא את התוכן של הקובץ שרשום ושם אותו במקום השורת include# (וזה נעשה רקורסיבית על התוכן שהוא כרגע הכניס גם).

אחרי שה-precompiler גומר נוצר קובץ list אותו למעשה הקומפיילר מקמפל. קוראים לזה גם translation unit.

הוא עובר על הוקבץ מלמעלה למטה. אם את משתמשת בשם (פונקציה או משתנה) שהקומפיילר לא מכיר מהשורות למעלה, הוא נותן הודעת טעות.

את יכולה גם לומר שקיים משתנה או פונקציה אבל הם לא נמצאים ב-translation unit הנוכחי אלא באחד אחר (וה-linker יוכל לחבר אותם אח"כ) בכדי שהקומפיילר לא יחשוב שזו טעות. את זה עושים בעזרת extern.
 
למעלה