include לחלק מסויים בקובץ H

Guy Yafe

New member
include לחלק מסויים בקובץ H

(שפת C)
יש לי קובץ שדורש שימוש במבנה מסויים שמוגדר בקובץ h. אם אני עושה include לקובץ הזה, שבתוכו כולל קבצים אחרים, התוצר של הקומפילציה מתנפל שלא לצורך. הכוונה היא לקובץ שבמקום 10MB תופס 100MB (פי עשרה).
הפתרון שלי כרגע הוא להעתיק רק את המבנה הזה לקובץ header משלי, שזה כמובן פתרון גרוע.
האם יש דרך לייבא רק את המבנה המסויים הזה בלי לכלול את כל הקוד המיותר בקוד שלי?
 

BravoMan

Active member
לא ממש, הוראת ה-include הסטנדרטית

שופכת הכל AS IS במקום שבו היא כתובה, ואין לה סייגים.

אם אתה יכול לערוך את קובץ ה-h המדובר, אתה יכול לשחק עם הוראות preprocessor, ספציפית ifdef וחברים, כדי שרק דברים מסוימים יכנסו, אבל אני לא חושב שזה הפתרון הנכון.

ממה שכתבת, נראה שיש סבטוחה רצינית במבנה של הפרויקט.
קבצי h לא אמורים לנפח את התוצר המקומפל, ובטח שבטח לא פי 10, גם אם יש מליון מהם.
אם תוכל, תפרט קצת יותר אם מדובר ב-framework או ספרייה מוכרים, או שהכל נכתב כחלק מהפרויקט?

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

בכל אופן, בהצלחה...
 

Guy Yafe

New member
לצערי אני לא רשאי לפרט הרבה יותר

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

BravoMan

Active member
הספרייה סטטית או דינמית?

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

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

אבל זה כאמור ניחושים בלבד, ואי אפשר לדעת בוודאות על עיוור.
 

vinney

Well-known member
תסתכל על הMAP FILE

שהקומפיילר מייצר. אתה אמור לזהות די בקלות מה תופס מקום, ולנסות לסנן את זה החוצה.
 
למעלה