الهياكل في C++: الفرق بين struct و typedef struct – شرح للمبتدئين

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

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

ابدأ الدورة

مقدمة: لماذا يختلط الأمر على المبتدئين بين struct و typedef struct؟

\n\n

إذا كنت قد ألقيت نظرة على Stack Overflow بحثاً عن إجابة لسؤال «Difference between 'struct' and 'typedef struct' in C++?»، فمن المحتمل أنك لاحظت أن هذا الموضوع حصد آلاف المشاهدات. وهذا ليس من قبيل الصدفة. العديد من مطوري C++ المبتدئين، خاصة أولئك الذين أتوا من عالم C أو يقرؤون كتباً دراسية قديمة، يصادفون بناء جملة غريباً مع typedef struct ويتساءلون بصدق: لماذا كتابة كلمة إضافية بينما يمكنك ببساطة كتابة struct؟

\n\n

في هذه المقالة، سنوضح مرة واحدة وإلى الأبد الفرق بين struct و typedef struct في لغة C++ الحديثة. سنلقي نظرة على الجذور التاريخية لهذا الالتباس، ونكتب بعض الأمثلة البرمجية، ونقدم توصيات واضحة حول كيفية الكتابة بشكل صحيح. هيا بنا!

\n\n

ما هو struct في C++؟

\n\n

لنبدأ بالأساسيات. الهيكل (struct) في C++ هو نوع بيانات مخصص يدمج عدة متغيرات (حقول) تحت اسم واحد. على عكس الفئة (class)، تكون جميع أعضاء الهيكل بشكل افتراضي بمعدل وصول public، ولكن فيما عدا ذلك، فإن struct و class في C++ متطابقان تقريباً (نعم، يمكن أن يحتوي الهيكل على دوال، ومنشئات، وحتى وراثة).

\n\n

يبدو تعريف الهيكل في C++ الحديثة كما يلي:

\n\n
// هيكل بسيط\nstruct Point {\n    int x;\n    int y;\n};\n\nint main() {\n    Point p1;          // صحيح: إنشاء كائن\n    p1.x = 10;\n    p1.y = 20;\n    return 0;\n}
\n\n

كل شيء بسيط وأنيق. ولكن من أين يأتي typedef struct إذاً؟

\n\n

خلفية تاريخية: إرث لغة C

\n\n

الأمر هو أنه في لغة C، لإنشاء متغير من نوع هيكلي مخصص، كان يجب كتابة الكلمة المفتاحية struct قبل اسم الهيكل. على سبيل المثال:

\n\n
// في C هكذا:\nstruct Point p1;  // بدون كلمة struct — خطأ
\n\n

للتخلص من هذا الإزعاج، ابتكر مبرمجو C حيلة باستخدام typedef:

\n\n
// نمط C: typedef + struct\ntypedef struct {\n    int x;\n    int y;\n} Point;\n\nint main() {\n    Point p1;  // الآن يمكن بدون struct\n    return 0;\n}
\n\n

ينشئ هذا البناء اسماً مستعاراً (alias) لهيكل بدون اسم. كان هذا مريحاً جداً في C. لكن في C++، كل شيء يعمل بشكل مختلف.

\n\n

هل نحتاج إلى typedef struct في C++؟

\n\n

الإجابة المختصرة: لا، لسنا بحاجة إليه. في C++ الحديثة (بدءاً من معيار C++98 وما بعده)، يصبح اسم الهيكل تلقائياً اسماً للنوع. يمكنك استخدامه بدون الكلمة المفتاحية struct.

\n\n

قارن بين الطريقتين:

\n\n
// الطريقة 1: C++ نقي (موصى به)\nstruct Point {\n    int x, y;\n};\n\nPoint p1;  // صحيح\n\n// الطريقة 2: نمط C قديم (غير موصى به)\ntypedef struct {\n    int x, y;\n} Point;\n\nPoint p2;  // صحيح أيضاً، ولكن لماذا الإضافة؟
\n\n

كلا الخيارين سيتم تجميعهما، لكن الأول أقصر وأوضح ويتوافق مع معايير البرمجة الحديثة. الخيار الثاني هو مجرد عادة انتقلت من C.

\n\n

متى قد يكون typedef struct مفيداً؟

\n\n

هناك بعض الحالات التي قد يكون فيها typedef struct في C++ مبرراً:

\n\n
    \n
  • كود عبر المنصات بلغة C و C++. إذا كنت تكتب ملف رأس يجب أن يتم تجميعه في كل من C و C++ (مثل مكتبة)، فمن الأفضل استخدام typedef struct — بهذه الطريقة سيعمل الكود في كل مكان.
  • \n
  • إنشاء اسم مستعار لنوع معقد. أحياناً يُستخدم typedef مع القوالب أو المؤشرات للهياكل لتبسيط بناء الجملة.
  • \n
  • التوافق مع الكود القديم (Legacy). إذا كنت تدعم مشروعاً قديماً مكتوباً بنمط C، فمن الأفضل عدم كسر النمط الحالي.
  • \n
\n\n

ولكن إذا كنت تكتب مشروعاً جديداً بلغة C++ نقية، انسَ أمر typedef struct.

المدونات

توصيات الكتب