نظرة عامة
يهدف هذا الدليل إلى استكشاف الطبيعة الحقيقية لأمر c++ المتاح في سطر أوامر لينكس وكيفية معالجته لملفات البرمجة داخلياً. سنتعرف على وجه المقارنة الدقيق بينه وبين مترجم g++، مع التطبيق العملي لخطوات بناء الشيفرات البرمجية وتوليد الملفات التنفيذية وتشغيلها في بيئة العمل اليومية.
إعداد بيئة التطوير والتحقق من إصدار أمر c++
نبدأ أولاً بتجهيز النظام بكافة أدوات التطوير وحزم المترجمات الأساسية على توزيعة Ubuntu، وذلك عن طريق تنفيذ الأمر التالي:

apt-get update -qq && apt-get install -y build-essential
ولمعرفة المسار الفعلي الذي يستقر فيه الملف التنفيذي لأداة c++ على النظام، نستعلم عبر الأمر:
which c++

وللكشف عن رقم إصدار المترجم المعتمد حالياً وتفاصيل بناء الحزمة البرمجية، نمرر خيار الفحص التالي:
c++ --version
⚙️ [أهم خيارات وسيطات سطر الأوامر]
-o <file> : تحديد الاسم المرغوب للملف التنفيذي الناتج بدلاً من التسمية التلقائية.-c : إيقاف العملية عند إنتاج ملف الكائن الوسيط (.o) وتخطي مرحلة الربط النهائي.-Wall : تمكين التنبيهات الشاملة للمساعدة في كشف المشكلات المنطقية ونقاط الضعف البرمجية.-O2 : تطبيق تحسينات برمجية ذكية لرفع سرعة المعالجة مع الحفاظ على حجم متوازن للملف.-std=<standard> : فرض استخدام مواصفة معيارية محددة للغة (على سبيل المثال c++17 أو c++20).-g : دمج بيانات التنقيح داخل الملف الثنائي لتمكين تتبع الأخطاء البرمجية وفحص المتغيرات عبر المنقح.

بنية الوصلة الرمزية لـ /usr/bin/c++ وعلاقتها بمترجم g++
يقوم الأمر التالي بسرد الخصائص التفصيلية للملف /usr/bin/c++، مما يوضح ما إذا كان الملف عبارة عن وصلة رمزية (Symbolic Link) ويكشف عن الوجهة التي يشير إليها:
ls -l /usr/bin/c++

للتحقق من إدارة هذا الرابط عبر نظام البدائل (update-alternatives) أو فك الارتباط الرمزي وصولاً إلى الملف الثنائي الحقيقي الذي تتم ترجمة الكود عبره، نستخدم السطر المركب التالي:
update-alternatives --display c++ 2>/dev/null || readlink -f /usr/bin/c++
يوفر هذا الإجراء توثيقاً قاطعاً للمترجم الفعلي المسؤول عن معالجة الأوامر عند استدعاء c++ في بيئة العمل.

إنشاء كود C++ مبدئي وترجمته وتشغيله عبر أمر c++
سنبدأ الخطوة التطبيقية بإنشاء ملف مصدري باسم hello.cpp يحتوي على دالة رئيسية لطباعة نص ترحيبي:
cat << 'EOF' > hello.cpp
#include <iostream>
int main() {
std::cout << "Hello from Linux c++!" << std::endl;
return 0;
}
EOF

نقوم بترجمة الملف hello.cpp باستخدام أمر c++ مع تفعيل خيارات التحسين والتنبيه لإنتاج الملف التنفيذي hello:
c++ -Wall -O2 -o hello hello.cpp
اكتمال الأمر بصمت ودون رسائل تحذيرية يشير إلى نجاح خطوة البناء وتوليد الملف الثنائي بالشكل الصحيح.

نشغل الآن الملف الناتج مباشرة من المسار الحالي للتحقق من سلامة المخرجات:
./hello
تظهر العبارة "Hello from Linux c++!" بنجاح على واجهة الطرفية مؤكدة سير العملية وفق المتوقع.

الترجمة باستخدام أحدث معايير اللغة عبر خيار (-std=c++20)
لاختبار التوافق مع الصيغ الحديثة، سنكتب برنامجاً في ملف modern.cpp يوظف خصائص معيار C++20 مثل std::string_view وتقييم التعبيرات في زمن الترجمة بواسطة constexpr:
cat << 'EOF' > modern.cpp
#include <iostream>
#include <string_view>
int main() {
constexpr std::string_view msg = "Modern C++20 on Ubuntu";
std::cout << msg << std::endl;
return 0;
}
EOF

نصدر أمر البناء محددين المعيار المطلوب صراحة عبر الخيار -std=c++20 لإنتاج الملف التنفيذي modern:
c++ -std=c++20 -o modern modern.cpp
بمجرد مطابقة الشيفرة لقواعد المعيار، ينتج المترجم التطبيق التنفيذي بسلاسة تامة.

نقوم بتشغيل التطبيق النهائي للتأكد من مخرجات المعيار الحديث:
./modern
تظهر الرسالة "Modern C++20 on Ubuntu" بوضوح على الطرفية، مما يثبت جاهزية بيئة الترجمة لدعم أحدث مواصفات C++.

استعرضنا معاً البنية التحتية لأمر c++ في توزيعات لينكس، والارتباط الوثيق الذي يجمعه بمترجم g++، وتناولنا التطبيق العملي لبناء المشاريع وفق المعايير المعاصرة. تمنحك هذه الخيارات والآليات مرونة عالية لبناء خطوط تطوير وتجميع برمجية فعالة وموثوقة لمشاريعك القادمة.