GCC vs G++: ما الفرق وأي مترجم C++ تختار؟

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

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

ابدأ الدورة

مقدمة: دراما ذات اسمين

\n\n

إذا سبق لك أن حاولت ترجمة برنامج بلغة C++ في لينكس أو macOS، فبالتأكيد واجهت أمرين متشابهين: gcc و g++. للوهلة الأولى، الفرق بينهما ضئيل — كلاهما يشغل المترجم، وكلاهما يمكنه العمل مع C و C++. ولكن بمجرد أن تخطئ في الاختيار، ستحصل على كومة من أخطاء الربط التي قد تفسد أمسيتك حتى على المطورين ذوي الخبرة.

\n\n

هذا السؤال هو أحد أكثر الأسئلة شيوعًا على Stack Overflow (أكثر من 200,000 مشاهدة!). غالبًا ما يعتقد المبتدئون: "بما أن gcc يمكنه ترجمة C++، فلماذا نحتاج إلى g++؟" وهذا خطأ. اليوم سنفهم نهائيًا ما هي الحيلة، من خلال أمثلة كود حقيقية. ستعرف متى تستخدم gcc ومتى تستخدم g++، وكيف لا تقع في فخ التبعيات الضمنية.

\n\n

نبذة مختصرة: ما هو GCC؟

\n\n

GCC (GNU Compiler Collection) ليس مترجمًا واحدًا، بل مجموعة كاملة من الأدوات. تتضمن مترجمات للغات C و C++ و Fortran و Ada وغيرها. تاريخيًا، كان الاختصار يعني "مترجم GNU C"، لكن المشروع توسع على مر السنين.

\n\n

الأمر gcc هو مشغل يقوم افتراضيًا بتشغيل مترجم لغة C. الأمر g++ هو نفس المشغل، ولكن مع علامات (flags) تُفعّل دعم C++. قد يبدو الأمر تافهًا. لكن هذا "التفاهة" هو الذي يحدد ما إذا كان كودك سيعمل أم لا.

\n\n

الفرق الرئيسي: ربط المكتبات القياسية

\n\n

تخيل أنك تكتب برنامجًا بسيطًا بلغة C++:

\n\n
#include <iostream>\nint main() {\n    std::cout << "مرحبًا بالعالم!" << std::endl;\n    return 0;\n}\n
\n\n

لنجرب ترجمته بطريقتين:

\n\n
gcc main.cpp -o program_gcc\ng++ main.cpp -o program_gpp\n
\n\n

النتيجة:

\n
    \n
  • g++ — ستنجح الترجمة.
  • \n
  • gcc — ستحصل على خطأ ربط undefined reference to `std::cout'.
  • \n
\n\n

لماذا؟ لأن gcc لا يربط تلقائيًا مكتبة libstdc++ (مكتبة C++ القياسية). فهو يعتقد أنك تترجم لغة C خالصة، ولا يوجد في C iostream أو std::string وغيرها من مزايا C++. بينما g++ يفعل ذلك تلقائيًا.

\n\n

بالطبع، يمكنك إجبار gcc على العمل مع C++ يدويًا بإضافة العلامة -lstdc++:

\n\n
gcc main.cpp -lstdc++ -o program_gcc_fixed\n
\n\n

ولكن لماذا نعيد اختراع العجلة؟ g++ يفعل ذلك "مباشرة من الصندوق".

\n\n

وماذا عن ترجمة لغة C الخالصة؟

\n\n

الأمر متماثل هنا. إذا كتبت برنامجًا بلغة C وحاولت ترجمته باستخدام g++، فمن المرجح أن يعمل. لكن g++ سيتعامل مع الكود على أنه C++، وهذا يعني:

\n
    \n
  • فحوصات أكثر صرامة للأنواع.
  • \n
  • قواعد مختلفة للتحويل الضمني للأنواع.
  • \n
  • احتمال ظهور تحذيرات خاطئة (warnings).
  • \n
\n\n

مثال. كود بلغة C:

\n\n
#include <stdio.h>\nint main() {\n    char *s = malloc(100);\n    printf("Hello\\n");\n    free(s);\n    return 0;\n}\n
\n\n

في لغة C هذا طبيعي. في C++ تحتاج إلى تحويل صريح (char*)malloc(100). سيعطي g++ خطأ، بينما gcc لن يعطي. الخلاصة: لمشاريع C استخدم gcc، ولمشاريع C++ استخدم g++.

\n\n

امتدادات الملفات: كيف يفهم المترجم اللغة؟

\n\n

نقطة مهمة أخرى: gcc و g++ ينظران إلى امتداد الملف.

\n\n
    \n
  • .c — يُترجم كـ C.
  • \n
  • .cpp، .cc، .cxx — يُترجم كـ C++.
  • \n
\n\n

إذا أعطيت gcc ملفًا بامتداد .cpp، فسيفهم أنه C++ ويستخدم الواجهة الأمامية الصحيحة (مترجم اللغة). لكن الربط سيظل بدون

المدونات

توصيات الكتب