.h أو .hpp لملفات الرأس في C++؟ نحسم الأمر نهائياً

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

.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

المدونات

توصيات الكتب