הגנות הכללה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 2 מתוך 61.
כאשר קובץ כותרת נכלל בפרויקט כמה פעמים, המהדר רואה שוב ושוב את אותן הצהרות, וכתוצאה מכך נגרמות שגיאות. הדבר קורה בדרך כלל כאשר כמה קבצים כוללים את אותה כותרת, או כאשר קובצי כותרת כוללים זה את זה. שומרי הכללה פותרים את הבעיה.
שומר הכללה משתמש בשלוש הנחיות קדם־מעבד כדי להבטיח שתוכן קובץ הכותרת יעובד פעם אחת בלבד:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
כך זה עובד: #ifndef MATH_UTILS_H בודק אם הסמל MATH_UTILS_H עדיין לא הוגדר. אם הוא לא הוגדר, המעבד המקדים ממשיך ומגדיר אותו מיד באמצעות #define MATH_UTILS_H. כל מה שנמצא בין נקודה זו לבין #endif נכלל בהידור.
בפעם השנייה שכותרת זו נכללת, MATH_UTILS_H כבר מוגדר, ולכן מדלגים על הבלוק כולו. שם השומר הוא בדרך כלל שם הקובץ באותיות גדולות, כאשר נקודות ותווים מיוחדים מוחלפים בקווים תחתונים.
לכל קובץ כותרת שתיצור צריכים להיות שומרי הכללה. זהו נוהג מקובל שמונע שגיאות קומפילציה והופך את הקוד שלך לבטוח להכללה מכל מקום בפרויקט.
אתגר
קלבואו נגן על קובץ כותרת מפני הכללה כפולה באמצעות הוספת שומרי הכללה. נבנה על כלי הברכה מהשיעור הקודם, אך הפעם נוודא שאפשר לכלול את קובץ הכותרת בבטחה כמה פעמים.
תיצרו שני קבצים:
greet.h: קובץ הכותרת שלכם, המכיל את הצהרת הפונקציהgreet. הפעם, עטפו את התוכן כולו בשומרי הכללה באמצעות הסמלGREET_H.main.c: הקובץ הראשי שלכם, שכולל את קובץ הכותרת, מממש את הפונקציהgreetוקורא לה מתוךmain().
הפונקציה greet צריכה לקבל פרמטר מסוג const char* עבור השם ולהדפיס:
Hello, Alice!קובץ הכותרת שלכם צריך להיות בנוי כך:
#ifndef GREET_H
#define GREET_H
// function declaration here
#endifתקבלו קלט אחד: שם (מחרוזת).
הדפיסו את הודעת הברכה בדיוק כפי שמוצג בפורמט שלמעלה, והחליפו את Alice בשם שסופק.
נסו בעצמכם
#include <stdio.h>
#include "greet.h"
// TODO: ממשו את הפונקציה greet שמדפיסה "Hello, <name>!"
int main() {
char name[100];
scanf("%s", name);
// TODO: קראו לפונקציה greet עם השם
return 0;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין