这是一个轻量级的c++选项解析器库,支持标准的GNU风格的选项语法。
版本3的突破性改变
如果您已经使用了版本2,那么在版本3(尚未发布的当前主版本)中有一些您应该知道的突破性更改。如果您是cxxopts的新手,您可以跳过此部分。
解析器不再修改它的参数,因此您可以传递const argc和argv,并期望它们不会被更改。
解析器对象不再依赖于解析器。因此,它可以从解析器之外的作用域返回,并且仍然工作。既然没有修改输入,ParseResult就存储了一个不匹配的参数列表。这些检索如下:
auto result = options.parse(argc, argv);
result.unmatched(); // get the unmatched arguments
快速入门
这是一个轻量级的c++选项解析器库,支持标准的GNU风格的选项语法。
可供选择的方案如下:
--long
--long=argument
--long argument
-a
-ab
-abc argument
c有一个论点,而a和b没有。
此外,——
之后的任何内容都将解析为位置参数。
基础知识
#include <cxxopts.hpp>
创建一个cxxopt::Options
实例
cxxopts::Options options("MyProgram", "One line description of MyProgram");
使用add_options
options.add_options()
("d,debug", "Enable debugging") // a bool parameter
("i,integer", "Int param", cxxopts::value<int>())
("f,file", "File name", cxxopts::value<std::string>())
("v,verbose", "Verbose output", cxxopts::value<bool>()->default_value("false"))
;
选项用一个长选项和一个可选的短选项声明。必须提供描述。第三个参数是值,如果省略它就是布尔值。任何类型都可以通过运算符>>给出,只要它可以被解析。
要解析命令行,请做:
auto result = options.parse(argc, argv);
要检索一个选项,请使用result.count(“option”)
来获取它出现的次数
result["opt"].as<type>()
得到它的值。如果“opt”不存在,或者不是正确的类型,那么将抛出异常。
注意options.parse
的结果应该被使用,只要创建options对象在作用域内.
未确认的参数
您可以允许跳过未识别的参数。这既适用于未解析为另一个选项的位置参数,也适用于与指定的参数不匹配的——
参数。这可以通过调用:
options.allow_unrecognised_options();
在结果对象中,它们被检索:
result.unmatched()
异常
异常情况抛出c++异常。有两种类型的异常:定义选项的错误和解析参数列表时的错误。所有异常都派生自cxxopts::OptionException
。定义选项的错误来自cxxopts::OptionSpecException
,解析参数的错误来自cxxopts::OptionParseException
。
所有异常都定义了what()
函数来获取解释错误的可打印字符串。
自助团体
为了显示帮助消息,可以将选项放入组中。要在组中放置选项,请将组作为字符串传递给add_options
。然后,在显示帮助时,将希望作为向量显示的组传递到帮助函数。
位置参数
位置参数可以被可选地解析为一个或多个选项。要设置位置参数,请调用
options.parse_positional({"first", "second", "last"})
其中“last”
应该是具有容器类型的选项的名称,其他选项应该只有一个值。
默认值和隐式值
选项可以使用默认值或隐式值声明,也可以同时使用两者。
默认值是当选项没有在命令行上指定时所接受的值。下面指定了一个选项的默认值:
cxxopts::value<std::string>()->default_value("value")
隐式值是在命令行上不带参数地给出选项时所接受的值。下面指定了一个隐式值:
cxxopts::value<std::string>()->implicit_value("implicit")
如果一个选项两者都有,那么不指定它就会给出值“value”,在命令行上写入——option会给出值“implicit”,写入——option=another会给出值“another”。
注意,默认值和隐式值始终存储为字符串,而不管您希望将其存储在哪种类型中。它将被解析,就像它是在命令行上给出的一样。
布尔值
布尔选项有一个默认的隐式值“true”
,它可以被覆盖。其效果是,单独写入-o
将把选项o
设置为true
。但是,它们也可以用各种字符串编写,使用=value
。没有办法消除位置参数与布尔值后面的值之间的歧义,因此我们选择它们为位置参数,因此-o false
不起作用。
std::vector<T>
的值
也支持以std::vector<T>
的形式解析值列表,只要T
可以解析。要分离列表中的单个值,使用定义CXXOPTS_VECTOR_DELIMITER
,默认情况下为’,’。确保在值之间没有使用空格,因为它们会被解释为下一个命令行选项。可以解析为std::vector<double>
的命令行选项示例:
--my_list=1,-2.1,3,4.5
选项指定多次
同一个选项可以用不同的参数指定多次,这些参数都将按照出现的顺序记录。一个例子:
--use train --use bus --use ferry
这是通过使用价值向量的选项支持:
options.add_options()
("use", "Usable means of transport", cxxopts::value<std::vector<std::string>>())
帮助
帮助的第一行中程序名后面的字符串可以被调用options.custom_help
完全替换。注意,您可能还想通过调用options.positional_help
来覆盖位置帮助。
例子
int main(int argc, char** argv)
{
cxxopts::Options options("test", "A brief description");
options.add_options()
("b,bar", "Param bar", cxxopts::value<std::string>())
("d,debug", "Enable debugging", cxxopts::value<bool>()->default_value("false"))
("f,foo", "Param foo", cxxopts::value<int>()->default_value("10"))
("h,help", "Print usage")
;
auto result = options.parse(argc, argv);
if (result.count("help"))
{
std::cout << options.help() << std::endl;
exit(0);
}
bool debug = result["debug"].as<bool>();
std::string bar;
if (result.count("bar"))
bar = result["bar"].as<std::string>();
int foo = result["foo"].as<int>();
return 0;
}
链接
只需要包含头文件
要求
唯一的构建要求是一个c++编译器,支持c++ 11个特性,如:
- 正则表达式
- 常量表达式
- 默认构造函数
GCC >= 4.9 or clang >= 3.1 with libc++ are known to work.