《commander-cpp》單頭文件的、鏈式調用的、自動生成幫助文檔的C++命令行參數解析庫
前言
作者我本人經常會寫一些命令行小工具,
此前一直使用node.js的三方庫commander.js來解析命令行參數,
commander.js是一個非常方便的命令行參數解析庫,
但是使用node.js也會有一些限制,比如:運行的電腦上需要安裝node.js,並且在一些對性能要求比較高的場景就會不太方便了,
針對上述情況,我嘗試切換到c++,但是在實際寫代碼時發現,現有的命令行解析庫使用時沒有commander.js那麼絲滑,讓我很難受,
於是,我決定仿照commander.js的設計,寫一個c++的命令行參數解析庫,取名為commander-cpp,頭文件名為commander_cpp.hpp
倉庫
倉庫地址:https://github.com/DoYoungDo/commander-cpp
特性
- 🎯 鏈式 API 設計,簡潔易用
- 📦 單頭文件,無外部依賴
- 🔧 支持選項(單值、多值、布爾值)
- 📝 支持參數(必需參數、可選參數、多值參數)
- 🌲 支持子命令和嵌套命令
- ⚙️ 支持默認值
- 📖 自動生成幫助信息
- 🔍 詳細的錯誤處理和日誌系統
- 🎨 支持選項別名和組合(如
-abc)
安裝
將 commander_cpp.hpp 文件複製到項目中,並在代碼中包含它:
#include "commander_cpp.hpp"
示例
示例代碼
#include "commander_cpp.hpp"
using namespace COMMANDER_CPP;
int main(int argc, char **argv) {
// 構造一個Command對象,命令名為"example", 等價於:Command().name("example")
Command("example")
// 設置版本號
.version("1.0.0")
// 添加一個簡介描述文本
->description("一個示例命令行應用")
// 添加一個選項,選項名是'name',設置別名'n',並指定參數必選
->option("-n --name <name>", "你的名字" /* 選項的描述 */)
// 添加一個參數,參數名是'file',並指定參數可選
->argument("[file]", "要處理的文件路徑")
// 添加一個動作回調,當命令行參數解析完成後調用
->action([](Vector<Variant/* = std::variant<...> */> args /* 參數值列表 */, Map<String /* 選項名 */, Variant /* 選項值 */> opts /* 選項值列表 */) {
if (opts.find("name") != opts.end()) {
std::cout << "Hello, " << std::get<String>(opts["name"]) << "!" << std::endl;
} else {
std::cout << "Hello, World!" << std::endl;
}
})
// 解析命令行參數
->parse(argc, argv);
return 0;
}
運行示例
$ ./example -n Alice
Hello, Alice!
$ ./example -V
1.0.0
$ ./example --help
Usage: example [options]
一個示例命令行應用
Options:
-V, --version out put version number.
-n, --name <name> 你的名字
-h, --help
更多示例...
注意
- 支持 C++17 或更高版本