אשמח אם מישהו ,בבקשה, יעשה לי מעט סדר

אשמח אם מישהו ,בבקשה, יעשה לי מעט סדר

ויאמר לי מתי בקבצי h צריך להשתמש ב ifndef ו-endif ? (אני לומד כעת, אגב, תכנת מונחה עצמים ב cpp).
 

selalerer

New member
ifndef הסבר:

יש שני שלבים חשובים בקומפילציה של ++C:
- preprocessor
- compile
(יש עוד אבל לא חשוב לענייננו)
בשלב ה-preprocessor מטופלים כל הפקודות שמתחילות ב-#.
השלב הזה הוא בעיקר מניפולציות טקסטואליות פשוטות על הקובץ והתוצאה של השלב הזה הוא קובץ list, קובץ טקסט קצת שונה ובד"כ גדול יותר ללא כל הפקודות # שהיו בקובץ המקורי.
הפקודה include# גורמת ל-preprocessor לקחת את הקובץ ששמו רשום אחרי הפקודה ולשים את כל תוכנו במקום שורת ה-include#.
יש הרבה קבצי h שמוכללים בצורה כזו בקבצי cpp. הסיבה היא שבקבצי h יש הגדרות שאתה רוצה שיהיו מוכרות ותוכל להשתמש בהם בקובץ cpp שלך.
יש גם קבצי h שמוכללים בתוך קבצי h אחרים מאותה הסיבה.
נאמר שהכללת בקובץ cpp שלך קובץ h אחד שיש בהגדרה של class A ואז אתה מכליל קובץ h אחר שהוא בתורו גם מכליל את הקובץ h הראשון. התוצאה בקובץ list (אחרי שה-preprocessor עשה את העבודה שלו) היא שיש לך בקובץ cpp שתי הגדרות class A. הקומפיילר ייתלונן על זה, יכתוב לך שזו טעות ויפסיק את עבודתו.
בכדי להימנע מהמצב הזה קיימת הפקודות ifndef# ו-define#.
define# גורמת להגדרת שם (כנראה נכנס לאיזו רשימה פנימית של ה-preprocessor).
ifndef# אומרת ל-preprocessor תתייחס לכל הטקסט שאחרי הפקודה הזו רק עם השם הזה אינו מוגדר כבר.
כך שפעם ראשונה שה-preprocessor נתקל בקוד כזה:
קוד:
#ifndef MY_FILE_H
#define MY_FILE_H
blabla
#endif
התוצאה תהיה blabla ובפעם השניה שה-preprocessor יתקל בקוד הזה הוא לא יכניס כלום לקובץ תוצאה (הקובץ list).

כך אפשר לדאוג שהקומפיילר לא יתלונן ש-class A קיים פעמיים בקוד.
 
למעלה