.h أو .hpp لملفات الرأس في C++؟ نحسم الأمر نهائياً
إذا كنت قد كتبت بلغة C++ لأكثر من أسبوعين، فبالتأكيد واجهت هذا السؤال. تفتح مشروع شخص آخر - تجد .h. تبدأ مشروعك الخاص - يتردد صوت في رأسك: "أو ربما .hpp أفضل؟". أو العكس: أنت من أشد المعجبين بـ .h، بينما يصر زميلك على أن .hpp هو الطريق الصحيح الوحيد.
مفسد: كلا الخيارين صحيحان تقنياً. المترجم لا يهتم. لكن هناك فرق، وهو مهم لتنظيم الكود، وقابليته للقراءة، وصيانة المشروع. دعنا نفهم ما وراء هذين الامتدادين، ومتى نختار أيهما.
الإجابة المختصرة: ما الفرق الجوهري؟
باختصار شديد:
.h- الامتداد التقليدي لملفات الرأس، القادم من لغة C. يُستخدم في كل من C و C++..hpp- امتداد أكثر حداثة، يشير بوضوح: "هذا C++، وليس C". صُمم للتمييز بين رؤوس C++ ورؤوس C.
لكن الشيطان، كما هو الحال دائماً، في التفاصيل. دعنا نتعمق أكثر.
السياق التاريخي: من أين أتت .h و .hpp؟
استخدمت لغة C الامتداد .h للملفات الرأسية منذ زمن بعيد. عندما ظهرت C++، استمر المبرمجون في البداية في استخدام .h - وهذا أمر طبيعي. المكتبة القياسية لـ C++ (مثل <iostream>) تخلت تماماً عن الامتدادات، لكن هذه قصة أخرى.
ظهر الامتداد .hpp كاستجابة للحاجة إلى فصل كود C عن كود C++. تخيل: لديك مشروع كبير، حيث بعض الملفات بلغة C والبعض الآخر بلغة C++. تقوم بتجميعه، ربما بمترجمات مختلفة أو بإشارات مختلفة. كيف تعرف بسرعة أي رأس مخصص لأي لغة؟ صحيح - بالنظر إلى الامتداد.
وهكذا أصبح .hpp (من "C Plus Plus header") المعيار الفعلي في المجتمع لرؤوس C++ الخالصة، خاصة في المكتبات مثل Boost.
متى نستخدم .h؟
لا تتعجل في التخلي عن .h. له نقاط قوته:
- التوافق مع C. إذا كان ملف الرأس الخاص بك يجب أن يتم تضمينه من كود C و C++ معاً - فقط
.h. لا خيارات أخرى. - المشاريع المحافظة. في قواعد الأكواد الكبيرة، حيث استقر الأسلوب على مر السنين، تغيير الامتدادات إلى
.hppهو ألم غير ضروري. - البساطة. ثلاثة أحرف بدلاً من أربعة. شيء صغير، لكنه لطيف.
مثال: رأس متوافق مع C و C++
// math_utils.h#ifndef MATH_UTILS_H#define MATH_UTILS_H
#ifdef __cplusplusextern "C" {#endif
int add(int a, int b);int multiply(int a, int b);
#ifdef __cplusplus}#endif
#endif // MATH_UTILS_Hيمكن تضمين هذا الملف في كل من .c و .cpp. إذا سميته math_utils.hpp، فقد يرتبك مبرمج C: "هل هذا مخصص لي؟".
متى نستخدم .hpp؟
هنا العكس: .hpp هو اختيار مبرمج C++ الحديث. خاصة إذا:
- تكتب فقط بلغة C++. لا يوجد C في المشروع ولن يكون.
- تستخدم القوالب (templates)، STL، الاستثناءات. هذه ميزات خاصة بـ C++، والامتداد
.hppيؤكد ذلك. - تريد فصل كود C++ عن C بشكل واضح. في المشاريع المختلطة، هذا ينقذ من الارتباك.
- تتبع الممارسات الحديثة. Boost، Qt (جزئياً)، والعديد من المكتبات الجديدة تستخدم
.hpp.
مثال: رأس C++ نموذجي مع فئة
// player.hpp#ifndef PLAYER_HPP#define PLAYER_HPP
#include <string>#include <vector>
class Player {public: Player(const std::string& nam