-
[
C++Boost
]程序参数项解析库
Program_options
使用指南
介绍
程序参数项
(program options)
是一系列
name=value
对,
program_options
允许程序开发者获得通
过命令行
(command
line)
和配置文件
(config
file)
获取这些参数项。
为什么
需要这样一个库?为什么比你手工写代码分解命令行参数要好?
?
使用更容易。定义参数处理的语法
简单,库自身很小。像转换参数值到指定的类型和保
存参数值到变量的事情都是自动处理
。
?
<
/p>
错误报告更友好。可报告错误的命令行参数。另外这个库能自动生成使用帮助,避免手
p>
工更新使用帮助导致的不一致。
?
参数能从不同地方读取。当命令行
参数不能满足要求,需要改用配置文件或环境变量。
这些功能都能支持,代码改动很小。
使用指南
快速入门
使用详解
参数多种来源
在本节,我们从最简单的例子开始,学习
program_options
库的通常用法。下面的例子仅仅是代
码片断,完整例子在
“BOOST_ROOT/libs/program_options/example”
目录里。对所有例子,假定
都在如下名字空间中:
namespace po =
boost::program_options;
快速入门
第一个例子尽可能简单:仅仅包含两个参数项。代码如下(完整代码见
< br>“example/”
):
// Declare the supported options.
po::options_description
desc(
_options()
(
(
;
po::variables_map vm;
po::store(po::parse_command_line(ac,
av, desc), vm);
po::notify(vm);
if ((
cout <<
desc <<
return 1;
}
if ((
cout <<
<< vm[
} else {
cout <<
}
首先用类
options_description
< br>描述所有允许的参数项,类的
add_options
方
法返回定义了
operator()
的代理对象,调用其
operator()
用来实际描述参数项,函数参数是参数项名称,
相关值
信息,参数项描述。本例中,第一个参数项没有值,第二个参数项有一个
int
类型的值。
其后,定义一个类
variables_map
对象。用来存储参数项的值,其
能存储任意类型的值。接着
调用
store,
parse_command_line
和
notify
函数,解析命令行参数并保存到
vm
p>
中。
现在,可以像使用
< br>std::map
一样来使用
variables_ma
p
类,但存储的值必须能通过
at
方法找
回。假如调用
as
方法指定的类型和实际类型不符,将抛出异常)
现在自己可以尝试编译一下代码,如何编译的例子如下:
$$bin/gcc/debug/first
Compression level was not set.
$$bin/gcc/debug/first --help
Allowed options:
--help
: produce help message
--compression
arg : set compression level
$$bin/gcc/debug/first --compression 10
Compression level was set to 10.
使用详解
参数项的值,除了
int
还有其他类型,还有其他属性
,我们下面将讨论。完整例子在
“example/options_”
中。
假如我们写一个编译器程序。它有最优化级别
,
包含多个路径
,
多个输入文件等参数
。描述参数
项如下:
int opt;
po::options_description
desc(
_options()
(
(
(
(
;
The
项和前例一样,在项目中有这个参数项是个好注意。
The
项体现两个新特性
.
首先,我们传递变量
(&opt)
地址,这个
变量用来保存获得
的参数项的值。然后,指定一个缺省值,用在此参数项用户没有设置值
的时候。
The
项说明了
options_d
escription
类接口仅仅来源于命令行的例子。用户
喜欢
用短参数项名称,
“
includ
e-
path,I”
名指出短参数项名是
“I”.
因此,
“
--includ
e-
path”
和
“
< br>-
I”
都能用。
The
参数项指定处理文件列表。像下面这样写没有问题:
compiler --input-file=
但通常情况常常这么写:
compiler
这里要解释一下这种用法。
像上例,没有参数名的命令行选项,在这个库里称为
“
位置参数项
”
,也能处理。库能解释
< br>“”
等同于
“
--input-
file=”
。下面是所需的附加的代码:
po::positional_options_description
p;
(
po::variables_map vm;
po::store(po::command_line_parser(ac,
av).
options(desc).positional(p).run(), vm);
po::notify(vm);
前两行指出所有的
“
位置参数项
”
应被翻译成
“
input-
file”
项。要注意用
command_line_parser
类解
析命令行,而不是
parse_command_line
函数。
parse_command_line
函数是为处
理简单情况对
command_line_parser
类的封
装,但现在要传递附加信息就
不适用了。
现在,所有参数项被描述
且被解析。我们暂不实现剩下的编译逻辑,仅仅打印参数项:
if ((
{
cout
<<
<< vm[
}
if ((
{
cout <<
<<
vm[
}
cout <<
如何编译的例子如下:
$$bin/gcc/debug/options_description
--help
Usage: options_description
[options]
Allowed options:
--help : produce help message
--optimization arg : optimization
level
-I [ --include-path ] arg :
include path
--input-file arg :
input file
$$bin/gcc/debug/options_description
Optimization level is 10
$$bin/gcc/debug/options_description
--optimization 4 -I foo
Include paths
are: foo
Input files are:
Optimization level is 4
这里有个
小问题,
“
帮助信息
”
要求指定
“
--input-
file”
项名称,这将把用户弄糊涂。在后面的例子
中可看到
怎样隐藏这个信息。
参数多种来源
要求用户在命令行给我们的编译器
指定所有参数不太现实。假如用户安装新库且想传递一个附
加命令行参数该怎么做?想实
现一次选择多次运行的时候使用该怎么做?可以创建一个配置文
件把命令行参数组织在一
起来完成这个工作。
当然,解析时需要结合命令行参数和配置
文件两方面的值。例如,在命令行指定的
“
最优化级
别
”
的值将覆盖配置文件的值。另一方面,
“
包含路径
”
应该包
含命令行和配置文件里两方面的
值。
下
面看代码。完整代码在
“examples/multiple_”
。参数项定义有两种细节。首
先,定
义
options_desc
ription
类的几个实例。原因是,通常情况下,不是所有参数项属性是类似的。一
些项,例如上面的
“
input-
p>
file”
,
应
该在自动帮助信息里不出现。一下项仅在配置文件中有意
义。其次,帮助信息有组织的输
出是个好主意,而不仅仅是参数项的长列表。下面声明几组参
数项:
// Declare a group of options that
will be
// allowed only on command
line
po::options_description
generic(
_options()
(
(
// Declare a group of options that will
be
// allowed both on command line and
in
// config file
po::options_description
config(
_options()
(
(
po::value< vector >()->composing(),
// Hidden
options, will be allowed both on command line and
// in config file, but will not be
shown to the user.
po::options_description
hidden(
_options()
(
注意在
项声明中调用
composing
方法,说明从不同来源的值应当被合并在一起,