آخر تحديث: 26 Feb, 2026

عند كتابة برامج C++، خاصةً في المشاريع الكبيرة، يصبح تنظيم الشيفرة في ملفات متعددة أمرًا أساسيًا للقراءة والصيانة. عادةً ما يتم ذلك باستخدام ملفات الرأس، التي تأتي بالامتدادين .h أو .hpp. فما الفرق بين هذين الامتدادين، وأيّهما يجب أن تستخدم؟
في هذه المقالة، سنستعرض الفروقات بين ملفات .h و.hpp، نستعرض تاريخهما، ونقدّم إرشادات حول أفضل الممارسات.
فهم ملفات الرأس في C++
تحتوي ملفات الرأس على إعلانات الدوال، الفئات، الثوابت، والماكرو التي يمكنك تضمينها في ملفات مصدر متعددة. تُضمّن هذه الملفات في ملفات .cpp (مصدر C++) باستخدام توجيه #include.
المحتويات الشائعة لملفات الرأس
- تعريفات الفئات
- إعلانات الدوال
- تعريفات الثوابت
- الماكرو
- القوالب (في بعض الحالات)
ملفات .h
ما هي ملف .h؟
ملفات .h هي ملفات رأس تقليدية وقد استُخدمت لأول مرة على نطاق واسع في لغة البرمجة C. لا تزال تُستخدم في كل من مشاريع C و C++ لإعلان الواجهات.
مثال على الاستخدام:
// mathutils.h
#ifndef MATHUTILS_H
#define MATHUTILS_H
int add(int a, int b);
int subtract(int a, int b);
#endif
المميزات:
- معروفة عالميًا (تُستعمل في كل من C و C++).
- مناسبة للمشاريع التي تشمل كلًا من كود C و C++.
العيوب:
- قد تُسبب غموضًا في مشاريع C++ حول ما إذا كان الملف بنمط C أو C++.
ملفات .hpp
ما هي ملف .hpp؟
ملفات .hpp هي ملفات رأس مخصصة لـ C++. تعمل بنفس طريقة ملفات .h لكنها تُستخدم لتوضيح صريح أن الرأس مخصص لكود C++.
مثال على الاستخدام:
// vectorutils.hpp
#ifndef VECTORUTILS_HPP
#define VECTORUTILS_HPP
#include <vector>
std::vector<int> filter_even(const std::vector<int>& input);
#endif
المميزات:
- تُظهر بوضوح أن الملف مخصص لكود C++.
- تُجنب الالتباس عند خلط C و C++.
- مفيدة في المشاريع متعددة اللغات أو الفرق التي تتبع قواعد تسمية صارمة.
العيوب:
- أقل شيوعًا قليلاً في القواعد البرمجية القديمة.
- قد لا تتعرف بعض الأنظمة القديمة التي تتوقع
.hعليها.
.h مقابل .hpp: الفروقات الرئيسية
| الميزة | ملف .h | ملف .hpp |
|---|---|---|
| ارتباط اللغة | C و C++ | C++ فقط |
| قاعدة أو عادة؟ | عادة | عادة |
| الاستخدام في مشاريع C++ | شائع | مفضَّل لدى البعض للوضوح |
| دعم القوالب | نعم | نعم |
| غموض الشيفرة | ممكن في المشاريع المختلطة اللغات | أقل احتمالًا |
أفضل الممارسات لاختيار بين .h و .hpp
إليك بعض الإرشادات العامة لمساعدتك في الاختيار:
استخدم .h إذا:
- كنت تكتب شيفرة يجب أن تكون متوافقة مع كل من C و C++.
- كنت تُصيانة أو تُوسّع كودًا قديمًا يستخدم بالفعل
.h.
استخدم .hpp إذا:
- تريد توضيح أن الملف مخصص لـ C++ فقط.
- تعمل في مشروع يقتصر على C++ أو تستخدم ميزات خاصة بـ C++ مثل الفئات، القوالب، والمساحات الاسمية.
هياكل المشاريع الشائعة
مثال باستخدام .h:
project/
├── main.cpp
├── mathutils.h
└── mathutils.cpp
مثال باستخدام .hpp:
project/
├── main.cpp
├── vectorutils.hpp
└── vectorutils.cpp
كل من الهيكلين صالح؛ الفرق يكمن أساسًا في الوضوح وتفضيلات الفريق.
الخلاصة
الاختيار بين .h و .hpp هو في الأساس مسألة عادة، لا وظيفة. كلاهما يخدم نفس الغرض: إعلان الواجهات والشيفرة المشتركة عبر ملفات مصدر C++ متعددة.
مع ذلك، بالنسبة للشيفرة الخاصة بـ C++، يمكن أن يجعل استخدام .hpp نواياك أوضح ويساعد على تجنّب الالتباس في قواعد الشيفرة الكبيرة—خاصةً تلك التي تشمل لغات متعددة. بالنسبة للمشاريع المختلطة أو القديمة، قد يظل .h هو الخيار المناسب.
الفكرة الأساسية:
استخدم
.hppعندما تريد الإشارة إلى “هذا كود C++ فقط” — استمر في استخدام.hإذا كنت تعمل في بيئات تمزج بين C و C++.