背景
cppcli是一个使用c++编写的命令行参数解析库, 要求c++最低版本为c++17, 它具有如下特点:
- 仅头文件 只需要include该头文件, 就可以快速添加到你的程序中
- 跨平台 可以在windows和linux平台中使用, 在msvc, gcc, mingw中均能通过编译
- 简单的API cppcli具有简单的API, 可以快速上手
- 自动的错误提示 当输入值不符合限制条件时, cppcli会自动给出错误提示
- 自动生成帮助信息 创建命令时指定提示信息, cppcli将根据这些提示信息, 自动生成全局性的帮助文档
- 无任何依赖 cppcli没有任何依赖
安装
无需安装, 直接include使用 (点击跳转到cppcli的gitee地址)
快速开始
cppcli::Option opt(argc, argv);
/* 未输入任何参数时, 打印帮助文档并退出程序 */
opt.emptyPrintHelpThenExit(true);
/* -s 命令添加 */
cppcli::Param s_param = opt("-s", "describe -s");
s_param.limitMustEnter().setDefault("cppcli"); // 设置-s必须输入, 默认值设置为cppcli
/* -h 命令添加, 帮助命令 */
cppcli::Param h_param = opt("-h", "gain help doc");
h_param.setAsHelpParam();
/*
* 检查命令行参数; 使用limitXXX() 进行限制的参数, 当其条件不满足时, parse()自动退出程序, 退出前打印错误原因
*/
opt.parse();
if (s_param.exists()) // 或 cppcli::Option::exists("-s") 或 cppcli::Option::exists(s_param)
{
cout << "-s exist, -s = " << s_param.getString() << endl;
}
else
{
cerr << "-s not exist" << endl;
}
# 输入了参数但未指定具体的值, parse通过并设置-s为默认值
E:\user\code\cppcli>./fastStart.exe -s
-s exist, -s = cppcli
# 输入了参数并指定了值, parse通过并获得输入值
E:\user\code\cppcli>./fastStart.exe -s hui
-s exist, -s = hui
# 未输入任何参数, 自动打印帮助文档
E:\user\code\cppcli>./fastStart.exe
workpath: E:\user\code\cppcli\bin
options:
-s describe -s MUST-ENTER[true] DEFAULT->cppcli
-h gain help doc MUST-ENTER[false] DEFAULT->[EMPTY]
# 输入-h命令, 打印帮助文档
E:\user\code\cppcli>./fastStart.exe -h
workpath: E:\user\code\cppcli\bin
options:
-s describe -s MUST-ENTER[true] DEFAULT->cppcli
-h gain help doc MUST-ENTER[false] DEFAULT->[EMPTY]
示例
设置参数为必须输入
cppcli::Option opt(argc, argv);
/* 添加 -s 参数 */
cppcli::Param s_param = opt("-s", "describe -s");
// 限制必须输入, 且输入值必须为列表值之一
s_param.limitMustEnter().limitOneOf("hui", "zack");
/* 添加 -h 参数 */
cppcli::Param h_param = opt("-h", "gain help doc").setAsHelpParam();
/*
* 使用limitXXX() 进行限制的参数, 当其限制条件不满足时, parse()自动退出程序, 退出前打印错误提醒
*/
opt.parse();
std::cout << opt.getExecPath() << std::endl;
if (s_param.exists())
{
cout << "-s = " << s_param.getInt()<< endl;
}
# -s参数限制为必须输入, 当用户未输入-s参数时, 自动退出并给出提示
E:\user\code\cppcli>.\bin\limitOneof.exe
Must enter this param: [-s]
Use [-h] gain help doc
限制命令参数的值必须为限定值之一
跳转到代码
使用 limitOneOf 函数, 设置参数值必须为限定值之一. 当输入了 -s 或 --start命令, 但指定的值不为限制列表之一时, parse 不通过, 程序退出并打印错误信息
cppcli::Option opt(argc, argv);
/* 添加 -s 参数 */
cppcli::Param s_param = opt("-s", "describe -s");
// 限制必须输入, 且输入值必须为列表值之一
s_param.limitMustEnter().limitOneOf("hui", "zack");
/* 添加 -h 参数 */
cppcli::Param h_param = opt("-h", "gain help doc").setAsHelpParam();
/*
* 使用limitXXX() 进行限制的参数, 当其限制条件不满足时, parse()自动退出程序, 退出前打印错误提醒
*/
opt.parse();
std::cout << opt.getExecPath() << std::endl;
if (s_param.exists())
{
cout << "-s = " << s_param.getInt()<< endl;
}
# -s参数限制为["hui", "zack"]列表值之一, 当用户未输入输入值不符合要求时, 自动退出并给出错误提醒
E:\user\code\cppcli>.\bin\limitOneof.exe -s none
Must be one of these values: [hui, zack], where command param = [-s]
Use [-h] gain help doc
限制为数字类型
cppcli::Option opt(argc, argv);
/* 未输入任何参数时, 打印帮助文档并退出 */
// opt.emptyPrintHelpThenExit(true);
/* 添加 -s 参数 */
cppcli::Param s_param = opt("-s", "describe -s");
// 限制必须输入, 且输入值必须为整数, 且输入范围必须为[1, 100]之间
s_param.limitMustEnter().limitInt().limitNumRange(1, 100); // 整数限制
// s_param.limitMustEnter().limitDouble().limitNumRange(1, 98.5); // 浮点数限制
/* 添加 -h 参数 */
cppcli::Param h_param = opt("-h", "get help doc");
h_param.setAsHelpParam();
/*
* 使用limitXXX() 进行限制的参数, 当其限制条件不满足时, parse()自动退出程序, 退出前打印错误原因
*/
opt.parse();
if (s_param.exists())
{
std::cout << "-s = " << s_param.getInt() << std::endl;
}
# 输入值不为数字时,
>> .\bin\limitNum.exe -s str
Please enter the correct type: [ NUMBER (INT) ], where command param = [-s]
Use [-h] gain help doc
# 当输入值为数字但不符合要求的数字范围时
.\bin\limitNum.exe -s 10086
Must be within this range: [1(MIN), 100(MAX)], where command param = [-s]
Use [-h] gain help doc
获取程序相关路径
opt.getExecPath() 返回执行命令时所在的目录全路径, opt.getWorkPath() 返回可执行文件(exe)的安装目录全路径
cppcli::Option opt(argc, argv);
cppcli::Param s_param = opt("-s", "describe -s");
cppcli::Param h_param = opt("-h", "gain help doc").setAsHelpParam();
opt.parse();
// 执行命令时所在的目录全路径
std::string execpath = opt.getExecPath();
// 可执行文件所在目录全路径
std::string workpath = opt.getWorkPath();
std::cout << "execpath = " << execpath << std::endl;
std::cout << "workpath = " << workpath << std::endl;
if (s_param.exists())
{
cout << "-s = " << s_param.getString() << std::endl;
}
主要项目负责人
开源协议
MIT © zack hui