أطر CLI للغة C++: من تحليل الوسائط إلى أدوات وحدة تحكم متكاملة
يعد تطوير أدوات وحدة التحكم بلغة C++ من أكثر المهام شيوعًا التي يواجهها المبرمجون. سواء كانت أداة لمعالجة البيانات، أو مترجمًا، أو سكريبت DevOps - لا يمكن الاستغناء عن التحليل الصحيح لوسائط سطر الأوامر. المعالجة اليدوية لـ argc/argv تتحول بسرعة إلى فوضى من strcmp و atoi، ويصبح دعم الخيارات والعلامات والأوامر الفرعية كابوسًا. وهنا تأتي أطر CLI للمساعدة - وهي مكتبات تتولى كل المهام الروتينية: الوصف التصريحي للواجهة، وتوليد المساعدة، والتحقق من صحة الأنواع، وحتى الإكمال التلقائي للـ shell.
في هذه المقالة، سنستعرض ثلاثة من أشهر الحلول للغة C++: CLI11 و cxxopts و docopt.cpp. ستتعلم كيفية إنشاء تطبيق وحدة تحكم احترافي بسرعة وبأقل جهد.
1. CLI11 - المعيار الحديث
CLI11 (GitHub: CLIUtils/CLI11) هي مكتبة header-only للغة C++11/14/17. تعتبر المعيار الذهبي بفضل واجهة برمجة التطبيقات الموجزة وإمكانياتها القوية: دعم الأوامر الفرعية المتداخلة، والتحقق من صحة النطاقات، والخيارات ذات القيم المتعددة، والعلامات، والوسائط الموضعية، والتوليد التلقائي لـ --help.
التثبيت
يكفي نسخ ملف الرأس CLI11.hpp إلى المشروع أو ربطه عبر CMake FetchContent.
مثال: أداة للأرشفة مع خيارات
#include <CLI/CLI11.hpp>#include <iostream>#include <string>
int main(int argc, char** argv) { CLI::App app("أداة أرشفة بسيطة");
std::string input_file; std::string output_file = "archive.zip"; int compression_level = 5; bool verbose = false;
app.add_option("-i,--input", input_file, "الملف المدخل")->required(); app.add_option("-o,--output", output_file, "الملف المخرج"); app.add_option("-c,--compression", compression_level, "مستوى الضغط (1-9)") ->check(CLI::Range(1, 9)); app.add_flag("-v,--verbose", verbose, "إخراج مفصل");
CLI11_PARSE(app, argc, argv);
std::cout << "جارٍ الأرشفة: " << input_file << ""; std::cout << "الإخراج: " << output_file << ""; std::cout << "المستوى: " << compression_level << ""; if (verbose) std::cout << "وضع التصحيح مفعل"; return 0;}التشغيل: ./archiver -i data.txt -o backup.zip -c 9 -v
عند حدوث خطأ أو استخدام --help، سيقوم CLI11 بعرض وصف جميل تلقائيًا.
2. cxxopts - الخفة والبساطة
cxxopts (GitHub: jarro2783/cxxopts) هي مكتبة header-only أخرى. إنها أبسط من CLI11، ولكنها تغطي 90% من الاحتياجات: الخيارات القصيرة/الطويلة، والقيم الافتراضية، والقوائم، والمساعدة. مثالية للأدوات الصغيرة.
مثال: قراءة الإعدادات
#include <cxxopts.hpp>#include <iostream>
int main(int argc, char* argv[]) { cxxopts::Options options("greeter", "برنامج ترحيب");
options.add_options() ("n,name", "اسم المستخدم", cxxopts::value<std::string>()) ("a,age", "العمر", cxxopts::value<int>()->default_value("0")) ("v,verbose", "إخراج مفصل", cxxopts::value<bool>()->default_value("false")) ("h,help", "مساعدة");
auto result = options.parse(argc, argv);
if (result.count("help")) { std::cout << options.help() << ""; return 0; }
std::string name = result["name"].as<std::string>(); int age = result["age"].as<int>(); bool verbose = result["verbose"].as<bool>();
std::cout << "مرحبًا، " << name << "!"; if (verbose) std::cout << "العمر