עבור לתוכן

בעיה בהבנת (c++ (header guards

Featured Replies

פורסם

יש לי בעיה בהבנת header guards והספריייה של :

"stdfax.h"

לא הבנתי מתי ואיפה אני צריך להכניס אותה,ולא הבנתי את הרעיון הכללי של header guards,למה אני צריך להתשמש בזה.האם השימוש בה הוא נחוץ בתהליך הלמידה?

תודה לעוזרים:)

(אשמח להפניייה למקור מידע במידת הצורך)

פורסם

כשאתה עושה include לקובץ אז הקומפיילר פשוט מעתיק את התוכן שלו לתוך הקובץ שלך לפני הקומפילציה.

עכשיו, נניח שיש לך קובץ header בשם a.h, ועוד שני קבצי header בשם b.h ו-c.h, ששניהם עושים include ל-a.h.

עכשיו נניח שיש לך קובץ בשם d.cpp שעושה include גם ל-b.h וגם ל-c.h. אז הקובץ a.h יכלל פעמיים ב-d.cpp - פעם אחת כחלק מ-b.h ופעם אחת כחלק מ-c.h. הבעיה היא שזה יגרום לכך שכל מה שמוגדר ב-a.h יוגדר פעמיים, וזה אסור.

ה-include guard גורם לזה שהקובץ a.h יכלל רק פעם אחת. ב-Visual Studio אפשר לעשות את זה עם הפקודה pragma once#, אבל הקונבנציה הכללית שתעבוד בכל הקומפיילרים היא באמצעות ifndef ו-define.

זה לא ממש נחוץ בזמן הלמידה (סביר להניח שאתה תעבוד עם פרויקטים פשוטים שלא מכילים שרשראות אינקלודים מורכבות), אבל זה הרגל טוב להקנות לעצמך.

stdafx זה חלק ממנגנון ה-precompiled headers של visual studio. כמו שציינתי קודם, כשאתה עושה אינקלוד לקובץ אז הוא מעתיק את התוכן שלו לתוך הקובץ שלך לפני הקומפילציה. כשעושים הרבה אינקלודים לתוך הרבה קבצים, זה יכול לגרום לכך שהקומפילציה תיקח הרבה זמן, כי הקומפיילר צריך לקמפל את קבצי ההדר שוב ושוב. הרעיון של precompiled headers הוא לקמפל את ההדרים בנפרד, בלי צורך לקמפל אותם לכל קובץ בנפרד. זה מנגנון מתקדם, ולכן בשלב הזה אין צורך שתתייחס אליו.

פורסם
  • מחבר

קודם כל,תודה על המענה:)

יש לי שאלה נוספת:

אני צריך להצהיר על הספרייה בכל קובץ שאני רושם(את ספריית stdafx) ?

פורסם

אל תיגע בזה פשוט. אם זה מופיע אל תמחק, אם זה לא מופיע אל תוסיף :)

פורסם
  • מחבר

זה דרש ממני להוסיף לכל תיקייה כדי שזה יתקמפל אז הוספתי :(

אוקיי אקח לצומת ליבי :)

שוב,תודה על המענה!

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים