博客 / 詳情

返回

【開源】《commander-cpp》單頭文件的、鏈式調用的、自動生成幫助文檔的C++命令行參數解析庫

《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 或更高版本
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.