חתימה והצהרה על פונקציה
הקומפיילר מתייחס לפונקציה בדיוק כמו שהוא מתייחס לכל משתנה. נבחן את הדוגמא הבאה:
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 - לכן קטע קוד זה לא יתקמפל, בצורה זהה לחלוטין לקטע הקודם. ניתן לפתור בעיה זו באחת משתי דרכים:
- החלפה בין הסדר של
f1ו-f2. כאשר התוכנית קטנה וסדר הקריאות לא מורכב, זה לחלוטין פתרון תקין. - כתיבת הצהרות על פונקציות בנוסף לכתיבת הפונקציות עצמן. בצורה דומה למשתנים, ניתן להצהיר על פונקציות - אך בשונה ממשתנים, אין מניעה להצהיר על פונקציה ורק לאחר מכן לממש אותה. הדרך לעשות זאת היא כך:
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).