دلایل تاریخی داره .
پیدایش زبان C بر میگرده به سال 1970 ... اون زمان کامپایلر ها به این شکل عمل می کردن که فقط فایل .c رو کامپایل می کردن وچون کامپایلر C به اعلان یا forward declration قبل از استفاده از تابع یا متغیر نیاز داشت از یک فایل جدا یعنی هدر استفاده می کردن که اعلانات را داخل اون بزارن و با include کردن محتویات و اعلان های داخل فایل هدر کپی میشد به اول فایل .c بعد این فایل کامپایل میشد .
++C هم که اولین استانداردش از C89 مشتق شده این رویه رو حفظ کرده .
داخل زبان های دیگه مثل C# و java این اطلاعات داخل خروجی ذخیره میشن
ولی خب مزیت هایی هم این کار داره مثلا تا حدی کد خوانا تر می کنه چون میشه داخل header فقط تعریف کلاس به همراه توضیحات و comment رو گذاشت و پیاده سازی رو داخل یک فایل دیگه انجام داد .
عیب اصلی هم که داره اینه که زمان کامپایل طولانی تر میشه چون مثلا اگر یک هدر داخل 10 تا فایل .cpp اینکلود بشه اگرفایل هدر عوض بشه تمام اون 10 تا فایل .cpp باید دوباره کامپایل بشن .