הגנות הכללה
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 אונליין