Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Studies

חתימה והצהרה על פונקציה

הקומפיילר מתייחס לפונקציה בדיוק כמו שהוא מתייחס לכל משתנה. נבחן את הדוגמא הבאה:

int main() {
    int x = y;
    int y = 7;
}

תוכנית זו לא תתקמפל, וקל לנו להבין למה - אנחנו משתמשים ב-y לפני שהגדרנו אותו. למעשה, הקומפיילר בשפת C מבצע סריקה של הקוד שלנו מלמעלה למטה באופן סדרתי, ולכן אין זה מפתיע שהוא מסרב לקמפל את התוכנית כמו שהיא - מבחינתו, כתבנו ג׳יבריש מוחלט.

בצורה דומה נבחן דוגמא נוספת:

void f1(void) {
    printf("Hi from f1\n");
    f2();
}
void f2(void) {
    printf("Hi from f2\n");
}
int main() {
    f1();
}

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

  1. החלפה בין הסדר של f1 ו-f2. כאשר התוכנית קטנה וסדר הקריאות לא מורכב, זה לחלוטין פתרון תקין.
  2. כתיבת הצהרות על פונקציות בנוסף לכתיבת הפונקציות עצמן. בצורה דומה למשתנים, ניתן להצהיר על פונקציות - אך בשונה ממשתנים, אין מניעה להצהיר על פונקציה ורק לאחר מכן לממש אותה. הדרך לעשות זאת היא כך:
void f1(void);
void f2(void);

void f1(void) {
    printf("Hi from f1\n");
    f2();
}
void f2(void) {
    printf("Hi from f2\n");
}
int main() {
    f1();
}

Note

לביטוי מהצורה ;int my_function(int x, int y) אנחנו קוראים חתימה של פונקציה. לפעמים מוותרים גם על שמות המשתנים וכותבים ;int my_function(int, int).