当前位置: 首页 > news >正文

C++ 02.好用的命令行解析库cmdline和CLI11

1. 获取命令行参数

在 C++ 程序中,我们可以通过 main 函数的参数来接收命令行参数。主要有两种形式:

1.1. 传统方式

int main(int argc, char* argv[])

其中:

  • argc: argument count,表示命令行参数的数量
  • argv: argument vector,是一个指针数组,包含所有的命令行参数字符串
    • argv[0] 通常是程序名称
    • argv[1] 开始才是实际的命令行参数

1.1.1. 示例代码

下面是一个简单的命令行参数处理示例:

#include <iostream>int main(int argc, char* argv[]) {std::cout << "参数数量: " << argc << std::endl;for(int i = 0; i < argc; i++) {std::cout << "参数 " << i << ": " << argv[i] << std::endl;}return 0;
}

1.1.2. 使用方法

编译并运行上述程序:

g++ main.cpp -o program
./program arg1 arg2 "argument 3"

输出将类似于:

参数数量: 4
参数 0: ./program
参数 1: arg1
参数 2: arg2
参数 3: argument 3

1.2. 现代处理方式

对于更复杂的命令行参数处理,建议使用一些现代的库:

  1. Boost.Program_options: 功能强大的命令行解析库
  2. cxxopts: 轻量级的头文件库
  3. CLI11: 现代化的命令行解析器
  4. cmdline: 一个简单的头命令行解析器,直接引入到程序中即可。头文件下载

这些现代库提供了更多功能:

  • 自动生成帮助信息
  • 类型安全的参数解析
  • 必选参数验证
  • 短选项和长选项支持
  • 默认值设置

1.3. cmdline

仅能在linux下运行,在windows下运行会报错,报错信息如下:找不到文件: #include <cxxabi.h>
示例代码


#include "cmdline.h"#include <iostream>
using namespace std;int main(int argc, char *argv[])
{cmdline::parser parser;parser.add<string>("host", 'h', "host name", true, "");parser.add<int>("port", 'p', "port number", false, 80, cmdline::range(1, 65535));parser.add<string>("type", 't', "protocol type", false, "http", cmdline::oneof<string>("http", "https", "ssh", "ftp"));parser.add("gzip", '\0', "gzip when transfer");parser.parse_check(argc, argv);cout << parser.get<string>("type") << "://"<< parser.get<string>("host") << ":"<< parser.get<int>("port") << endl;if (parser.exist("gzip")) cout << "gzip" << endl;return 0;
}

linux编译&运行

g++ main.cpp -o main
./main  --host "a.com" -p 8080 -t https 

输出将类似于:

https://a.com:8080

常见的用法

parser.add<std::string>("host", 'h', "host name", true, "");  //参数做为std::string 类型
parser.add<int>("port", 'p', "port number", false, 80, cmdline::range(1, 65535));  //参数做为int 类型

add() 函数的参数说明,以add<std::string>()为例:

template <class T, class F>void add(const std::string &name,  //长的参数名,运行时带 --char short_name=0, //短的参数名,运行时带 -const std::string &desc="", //参数描述bool need=true, //是否必须const T def=T(), //默认值F reader=F()){if (options.count(name)) throw cmdline_error("multiple definition: "+name);options[name]=new option_with_value_with_reader<T, F>(name, short_name, need, def, desc, reader);ordered.push_back(options[name]);}

注意:

  1. char 型值在解析命令行时会报错,可以使用string类型值暂时存储解析的命令行的值,然后从string类型值中获取char型值

1.4. CLI11用法

vcpkg install cli11

简要示例代码

#include <CLI/CLI.hpp>
#include <iostream>int main(int argc, char** argv) {// 创建CLI对象CLI::App app{"A brief description of your program"};// 定义一个变量来存储命令行参数值int my_int{0};std::string my_string;// 添加选项app.add_option("-i,--int-option", my_int, "An integer option");app.add_option("-s,--string-option", my_string, "A string option");// 解析命令行CLI11_PARSE(app, argc, argv);// 使用获取到的值std::cout << "Integer option: " << my_int << "\n";std::cout << "String option: " << my_string << "\n";return 0;
}  

编译&运行

cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE="${env:VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
cmake --build build 
if ($?)
{.\build\Debug\main.exe -i 5 -s hello
}

输出如下:

Integer option: 5
String option: hello

1.5. 参考资料

  1. GitHub - tanakh/cmdline: A Command Line Parser

相关文章:

  • 【LLIE专题】基于事件相机照度估计的暗光增强方案
  • poppler_path 是用于 Python 库如 pdf2image 进行 PDF 转换时
  • 天文数据处理:基于CUDA的射电望远镜图像实时去噪算法(开源FAST望远镜数据处理代码解析)
  • 大规模实验管理系统的GPU资源调度设计(基于优先级队列的动态算力分配算法)
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取目标App的程序图标?
  • Linux 之 MTD 子系统框架
  • 手机打电话时由对方DTMF响应切换多级IVR语音菜单(话术脚本与实战)
  • 第十节第六部分:常见API:DateTimeFormatter、Period、Duration
  • 智能办公协同系统开发日志(三):画板模块设计与实现全记录
  • Minion-Agent:软件测试领域的智能自动化实践
  • JUC入门(五)
  • DeepSeek Mermaid:如何将文本直接转化为精美图表? -优雅草卓伊凡
  • LeetCode Hot100(滑动窗口)
  • STL 转 STP 深度技术指南:从 3D 打印模型到工程标准的跨领域转换全解析(附迪威模型在线方案)
  • ai之pdf解析工具 PPStructure 还是PaddleOCR
  • 微信小程序之Promise-Promise初始用
  • 华为模拟器练习简单的拓扑图(3台路由器和2台pc)
  • 线性Wi-Fi FEM被卷死,非线性FEM是未来?
  • 【学习笔记】机器学习(Machine Learning) | 第七章|神经网络(3)
  • Linux 搭建FTP服务器(vsftpd)
  • 外国网站加速器/软件外包公司有哪些
  • 学校网站下载/老域名
  • 用dw做网站毕业设计/品牌如何做推广
  • 深圳做高端企业网站建设公司/市场运营和市场营销的区别
  • 网站里的副栏目是什么/网络推广和网络销售的区别
  • 深圳网站建设亿联时代/微信营销软件有哪些