【开源-常用C/C++命令行解析库对比】

server/2025/3/4 22:24:46/

以下是几种常用的C/C++命令行解析库的对比表格,以及它们的GitHub开源库地址:

库名称语言特点是否支持子命令是否支持配置文件是否支持自动生成帮助信息GitHub地址
ClaraC++11及以上单一头文件,轻量级,非异常错误处理,自动类型转换Clara GitHub
cxxoptsC++11及以上单一头文件,轻量级,支持多种数据类型,自动帮助信息cxxopts GitHub
CLI11C++11及以上功能强大,支持子命令、配置文件,自动生成帮助信息CLI11 GitHub
argparseC++17现代C++17头文件库,支持多种参数类型,自动帮助信息argparse GitHub
CmdlineC++轻量级,支持布尔标志和参数绑定,自动生成帮助信息Cmdline GitHub
cargsC/C++轻量级,支持多种参数类型,自动生成帮助信息cargs GitHub

选择建议:

  1. 如果你需要轻量级且易于集成的库,可以选择 Claracxxopts,它们都是单一头文件库,易于集成到项目中。
  2. 如果你需要功能强大且支持复杂命令行接口CLI11 是一个不错的选择,它支持子命令、配置文件和自动生成帮助信息。
  3. 如果你使用的是C语言或需要兼容C语言的库,可以考虑 cargs
  4. 如果你需要现代C++17特性支持argparse 是一个简洁且功能丰富的选择。

以下是几种常用C/C++命令行解析库的简单使用示例

1. Clara

GitHub地址:Clara GitHub
示例代码:
#include <boost/program_options.hpp>
#include <iostream>namespace po = boost::program_options;int main(int argc, char* argv[]) {po::options_description desc("Allowed options");desc.add_options()("help,h", "produce help message")("compression,c", po::bool_switch(), "enable compression");po::variables_map vm;po::store(po::parse_command_line(argc, argv, desc), vm);po::notify(vm);if (vm.count("help")) {std::cout << desc << "\n";return 1;}bool compression = vm["compression"].as<bool>();std::cout << "Compression is " << (compression ? "on" : "off") << ".\n";return 0;
}
输出示例:
$ ./example --help
Allowed options:--help,h         produce help message--compression,c  enable compression

2. cxxopts

GitHub地址:cxxopts GitHub
示例代码:
#include <cxxopts.hpp>
#include <iostream>int main(int argc, char* argv[]) {cxxopts::Options options("This is a test program.", "This goes after the options.");options.add_options()("h,help", "Print usage")("n,name", "Your name", cxxopts::value<std::string>())("a,age", "Your age", cxxopts::value<int>());auto result = options.parse(argc, argv);if (result.count("help")) {std::cout << options.help() << std::endl;return 0;}std::string name = result["name"].as<std::string>();int age = result["age"].as<int>();std::cout << "Hello, " << name << "! You are " << age << " years old." << std::endl;return 0;
}
输出示例:
$ ./example --name John --age 30
Hello, John! You are 30 years old.

3. CLI11

GitHub地址:CLI11 GitHub
示例代码:
#include <CLI/CLI.hpp>
#include <iostream>int main(int argc, char* argv[]) {CLI::App app{"This is a test application."};std::string name;int age;app.add_option("-n,--name", name, "Your name")->required();app.add_option("-a,--age", age, "Your age")->required();CLI11_PARSE(app, argc, argv);std::cout << "Hello, " << name << "! You are " << age << " years old." << std::endl;return 0;
}
输出示例:
$ ./example --name Alice --age 25
Hello, Alice! You are 25 years old.

4. argparse

GitHub地址:argparse GitHub
示例代码:
#include <argparse/argparse.hpp>
#include <iostream>int main(int argc, char* argv[]) {argparse::ArgumentParser program("This is a test program.");program.add_argument("-n", "--name").help("Your name").required();program.add_argument("-a", "--age").help("Your age").required();try {program.parse_args(argc, argv);} catch (const std::runtime_error& err) {std::cerr << err.what() << std::endl;std::cerr << program;return 1;}std::string name = program.get<std::string>("--name");int age = program.get<int>("--age");std::cout << "Hello, " << name << "! You are " << age << " years old." << std::endl;return 0;
}
输出示例:
$ ./example --name Bob --age 40
Hello, Bob! You are 40 years old.

5. Cmdline

GitHub地址:Cmdline GitHub
示例代码:
#include <cmdline.h>
#include <iostream>int main(int argc, char* argv[]) {cmdline::parser p;p.add<std::string>("name", 'n', "Your name", true);p.add<int>("age", 'a', "Your age", true);p.parse_check(argc, argv);std::string name = p.get<std::string>("name");int age = p.get<int>("age");std::cout << "Hello, " << name << "! You are " << age << " years old." << std::endl;return 0;
}
输出示例:
$ ./example -n Charlie -a 35
Hello, Charlie! You are 35 years old.

6. cargs

GitHub地址:cargs GitHub
示例代码:
#include <cargs.h>
#include <stdio.h>int main(int argc, char* argv[]) {cargs_parser_t parser = cargs_parser_create("This is a test program.");cargs_add_option(parser, "name", 'n', "Your name", CARGS_STRING);cargs_add_option(parser, "age", 'a', "Your age", CARGS_INT);if (!cargs_parse(parser, argc, argv)) {cargs_print_help(parser);return 1;}char* name = cargs_get_string(parser, "name");int age = cargs_get_int(parser, "age");printf("Hello, %s! You are %d years old.\n", name, age);cargs_parser_destroy(parser);return 0;
}
输出示例:
$ ./example -n David -a 28
Hello, David! You are 28 years old.

总结

以上是六种常用命令行解析库的简单示例。每种库都有其特点和适用场景,你可以根据项目需求选择合适的工具。希望这些示例对你有所帮助!


http://www.ppmy.cn/server/172437.html

相关文章

大白话React Hooks,新特性怎么用?

啥是 React Hooks React Hooks 是 React 16.8 版本引入的新特性&#xff0c;它能让你在不编写 class 的情况下使用 state 以及其他的 React 特性。就好比以前你盖房子得用一种特定的建筑方式&#xff08;class 组件&#xff09;&#xff0c;现在有了新工具&#xff08;Hooks&a…

强化学习无痛上手笔记第1课

文章目录 Markov Decision ProcessDefinitionRelated Concepts Policy for MDP AgentDefinitionJudgement for PolicyValue FunctionsTD formula for value functionsRelation of V and QPolicy CriterionPolicy Improvement TheoremOptimal PolicyReinforcement Learning Fund…

2024年国赛高教杯数学建模A题板凳龙闹元宵解题全过程文档及程序

2024年国赛高教杯数学建模 A题 板凳龙闹元宵 原题再现 “板凳龙”&#xff0c;又称“盘龙”&#xff0c;是浙闽地区的传统地方民俗文化活动。人们将少则几十条&#xff0c;多则上百条的板凳首尾相连&#xff0c;形成蜿蜒曲折的板凳龙。盘龙时&#xff0c;龙头在前领头&#x…

C++初阶—list类

第一章&#xff1a;list的介绍及使用 1.1 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指…

常见的正则匹配规则

目录 1&#xff0c;匹配数字2&#xff0c;匹配字母3&#xff0c;匹配字母和数字4&#xff0c;匹配邮箱地址5&#xff0c;匹配URL6&#xff0c;匹配身份证号7&#xff0c;匹配手机号8&#xff0c;匹配日期9&#xff0c;匹配IP地址10&#xff0c;匹配密码强度11&#xff0c;匹配空…

bc命令学习9 获取bc命令的源码并编译

本文介绍如何获取bc命令的源码并编译,这个对于初学linux还是有点难的,主要坑比较多。下面主要介绍windows下使用wsl环境进行编译 1 初始化工作 创建一个文件夹,我选择创建一个C:\run\linux,这个可以自己选择.然后启动在该文件夹下面启动wsl ,首先获取bc文件的相关信息,可以看…

Lua | 每日一练 (5)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Lua | 每日一练 (5)题目参考答案浅拷贝深拷贝使用场景…

蓝桥与力扣刷题(蓝桥 k倍区间)

题目&#xff1a;给定一个长度为 N 的数列&#xff0c;A1,A2,⋯AN​&#xff0c;如果其中一段连续的子序列 Ai,Ai1,⋯Aj( i≤j ) 之和是 K 的倍数&#xff0c;我们就称这个区间[i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗&#xff1f; 输入描述 第一行包含两…