17
חלוקת תכנית לקבצים ותהליך הקומפילציה
17.1 מוטיבציה
עת התכניות שאנו כותבים גדלות קורה לא אחת שאנו מעוניינים לחלק את התכנית לכמה קבצים שיקומפלו יחד לכדי תכנית אחת שלמה (לעתים נאמר: לכדי אפליקציה אחת). סיבות שונות מביאות אותנו לחלוקת התכנית לכמה קבצים:
א. מתכנתים שונים יכולים לעבוד במקביל על חלקים שונים בתכנית; כל חלק ייכתב בקובץ נפרד.
ב. פונ' אשר מבצעות משימה דומה (למשל פונ' המבצעות משימות מתמטיות שונות בתכניתנו) יושמו בקובץ יחיד. עת נזדקק גם בתכנית אחרת למשימות אלה, נוכל לשלב את הקובץ בַתכנית האחרת בנקל (בלי שנצטרך לבצע 'העתק\הדבק' מקובץ לקובץ לַפונ' הדרושות לנו).
ג. עת מתגלית שגיאה בחלק כלשהו של התכנית, או עת אנו רוצים לשנות חלק כלשהו בתכנית איננו צריכים לקמפל את כל התכנית (דבר שעלול לקחת זמן רב אם התכנית כוללת אלפים רבים של שורות קוד), אלא אנו מקמפלים (במובן הצר והמדויק של המילה) רק את הקובץ שמכיל את הקוד שהשתנה, ואחר אנו כורכים (עושים linking) לכלל הקבצים המקומפלים (אלה שלא שונו, וזה ששונה) לכדי תכנית שלמה חדשה.
לסיכום: מגוון של סיבות מביאות אותנו לרצות לחלק את תכניתנו למספר קבצים. בפרק זה נלמד כיצד לעשות זאת.
![](https://www.google.com/images/icons/product/drive-32.png)
17.2 חלוקת תכנית לקבצים - חלק ב': הקבצים המרכיבים את התכנית, וקימפולה (כולל באמצעות פקודת ה: make)
הסרטון המתאר את השימוש בפקודת ה: make מופיע בסעיף 17.5
![](https://www.google.com/images/icons/product/drive-32.png)
17.3 קובצי כותר (header)
![](https://www.google.com/images/icons/product/drive-32.png)
הסבר כללי אודות פעולת ה: include
![](https://www.google.com/images/icons/product/drive-32.png)
17.4 קומפילציה בחלקים של תכנית המורכבת ממספר קבצים, כולל קובצי header
17.5 קומפילציה של תכנית המורכבת ממספר קבצים תוך שימוש בפקודה make (ובקובץ makefile)
17.6 הנחיית המהדר (compiler directive): שהינה: define#
א' פעולת ה: define להגדרת קבועים
ב': פעולת ה: define להגדרת מאקרו
![](https://www.google.com/images/icons/product/drive-32.png)
17.7 הנחיית המהדר (compiler directive): שהינה: ifdef#
א': הסבר אודות ifdef
ב': הסבר אודות ifdef
![](https://www.google.com/images/icons/product/drive-32.png)
17.8 כתיבת תכנית המורכבת מכמה קבצים, ועושה שימוש בכמה struct-ים
בדוגמה זאת אציג תכנית העושה שימוש בנקודות, ובמלבנים שצלעותיהם מקבילות לצירים.
על כן התכנית תכלול את הקבצים:
- קובץ header וקובץ מימוש פונ' ל: struct Point
- קובץ header וקובץ מימוש פונ' ל: struct Rectangle
- קובץ לתכנית הראשית שתגדיר ותשתמש בנקודות ובמלבנים.
כמו כן, מלבן נגדיר באמצעות שתי נקודות (פינה שמאלית עליונה, ופינה ימנית תחתונה), ולכן גם הקוד של מלבן עושה שימוש בקוד של נקודה.
נראה את הקבצים הדרושים, את הבעיה שמתעוררת, ואת פתרונה.
הקבצים Point.h, Point.cc, Rect.h, Rect.cc
א': קובץ ה: header וקובץ ה: cc עבור נקודות
ב': קובץ ה: header וקובץ ה: cc עבור מלבנים
![](https://www.google.com/images/icons/product/drive-32.png)
קובץ התכנית הראשית ובעיית ההכללה הכפולה
![](https://www.google.com/images/icons/product/drive-32.png)
קובץ התכנית הראשית, ופתרון בעיית ההכללה הכפולה בעזרת ifndef
![](https://www.google.com/images/icons/product/drive-32.png)
17.9 קבועים גלובליים
![](https://www.google.com/images/icons/product/drive-32.png)
17.10 מבוא לתכנות מונחה עצמים - עקרון הכימוס
![](https://www.google.com/images/icons/product/drive-32.png)
17.11 ספריה סטטית
![](https://www.google.com/images/icons/product/drive-32.png)
17.12 ספריה דינאמית
![](https://www.google.com/images/icons/product/drive-32.png)