עבור לתוכן

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

Featured Replies

פורסם

היי

שכחתי את ה-syntax להגדרת לשתנה גלובלי ב++C

חיפוש ב-MSDN לא הניב תוצאות...

const ו-define# לא עוזרים פה... (הם מקומיים)

מישהו זוכר?

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

תודה

פורסם

כמה דברים:

1. #define זה לא משתנה בכלל, זו פקודה ל-preprocessor שגורמת לו להחליף מילה מסויימת במילה אחרת (לדוגמה, #define NUMBER 1 תחליף כל הופעה של המילה NUMBER ב-1).

2. const אומר שהמשתנה הוא בעצם קבוע, ולא משתנה בכלל. יכול להיות const לוקאלי ו-const גלובאלי.

3. משתנה גלובאלי הוא כל משתנה שלא מוגדר בתוך שום פונקציה או קלאס. (main היא גם פונקציה, אגב).

נניח שאני רוצה להגדיר משתנה גלובאלי בשם number מסוג int, אז הדרך היפה לעשות את זה היא:

בקובץ ה-h להגדיר את השורה extern int number;

בקובץ ה-c להגדיר int number;

וכל קובץ שאתה רוצה שיכיר את המשתנה צריך לעשות include לקובץ ה-h ההוא.

(המילה extern אומרת לקומפיילר שהמשתנה קיים, אבל הוא מוגדר במקום אחר)

פורסם
  • מחבר

כמה דברים:

1. #define זה לא משתנה בכלל, זו פקודה ל-preprocessor שגורמת לו להחליף מילה מסויימת במילה אחרת (לדוגמה, #define NUMBER 1 תחליף כל הופעה של המילה NUMBER ב-1).

2. const אומר שהמשתנה הוא בעצם קבוע, ולא משתנה בכלל. יכול להיות const לוקאלי ו-const גלובאלי.

3. משתנה גלובאלי הוא כל משתנה שלא מוגדר בתוך שום פונקציה או קלאס. (main היא גם פונקציה, אגב).

את זה ידעתי, אולי הניסוח שלי עקום... NM

וכל קובץ שאתה רוצה שיכיר את המשתנה צריך לעשות include לקובץ ה-h ההוא.

(המילה extern אומרת לקומפיילר שהמשתנה קיים, אבל הוא מוגדר במקום אחר)

גם את זה עשיתי, הבעיה שאני מקבל שגיאת קימפול:

include nesting level is 363 deep; possible infinite recursion

fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit

יוצאת לי מין לולאת הפניות (אבל אני חייב אותם)...

לצורך הבהרה: יש לי פרוייקט עם cpp אחד וכמה h... ב-cpp יש רק קריאה לפונקציה ראשית שהוא ב-h, וזהו

פורסם

אוקי, הבעיה שלך היא שככל הנראה יש לך קובץ שעושה include לעצמו איכשהו :)

(נניח, קובץ א' עושה אינקלוד לקובץ ב', וקובץ ב' עושה אינקלוד לקובץ א')

הפתרון הוא לעשות מה שנקרא include protection.

בתחילת כל קובץ h שים את שתי השורות הבאות:


#ifndef FILENAME_H
#define FILENAME_H

ובסופו:

#endif

(כשבמקום FILENAME שים את שם קובץ ה-h)

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

פורסם
  • מחבר

תודה רבה

אמנם לקח לי קצת זמן לשנות את הקוד בהתאם (גם למדתי כמה דברים בדרך), אבל עכשיו הכל עובד :xyxthumbs:

10x

ארכיון

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

דיונים חדשים