כמו שאמרו...
העיקרון המנחה הוא, אם אתה משתמש במשהו בקובץ ה-H, אתה צריך להציג את המקור שלו. כלומר, ההצהרות על הפונקציות שאתה רוצה לחלוק אתה שם ב-H (פונקציות לשימוש עצמי אתה מסתיר בקובץ המימוש). אם אתה משתמש ב-define בקובץ ה-H בצורה כלשהי, אתה גם צריך להציג הצהרה שלו שם. למשל, אם אתה שולח לפונקציה כפרמטר מצביע למערך בגודל MAX_SIZE, המשתמש חייב לדעת מהוא הגודל הזה כדי לא לחרוג ממנו, ובגלל זה הוא חייב לראות את ה-define שעשית שמגדיר את MAX_SIZE. כנ"ל ל-includes. אם אתה משתמש בטיפוס X, שהוגדר בקובץ X.h, ויש לך איזו פונקציה ב-header שמקבלת משתנה מטיפוס X למשל, המשתמש חייב לדעת מהו הטיפוס הזה, ולכן אתה חייב לציין את המקור, כלומר לשים את ה-include בקובץ ה-H. בהצלחה!