2009年4月18日星期六

【原】Boost库之program_options的使用

我们在编写程序时,有时需要解析命令行参数,比如小蜜蜂调用聊天历史记录程序,监视器调用日志管理程序等。遗憾的是,C++标准库并没有提供解析命令行参数的功能,我们必须自己来完成解析工作。如果命令行参数比较复杂,要正确地解析可能并不是一件容易的事情。即使解析正确了,代码也不一定具有通用性。那么,有没有一个封装好的功能强大而且简单易用的命令行解析类呢?答案是Boost库的program_options。

Boost库的program_options相对于手工编写代码解析命令行参数具有以下几个优点:
1.使用更容易。定义参数处理的语法简单,库自身很小,像转换参数值到指定的类型和保存参数值到变量的事情都由库自动处理。
2.错误报告更友好,可以报告错误的命令行参数。另外这个库能自动生成使用帮助,避免了手工更新使用帮助而导致的不一致。
3.参数能从不同地方读取。当命令行参数不能满足我们的要求时,可以改用配置文件。

下面介绍一下使用program_options解析命令行参数的具体用法。
首先声明一个options_description类的对象,该对象用于添加我们需要解析的选项名字。

options_description myOptions("command line options by hujian");
int nLevel;
myOptions.add_options()("help,h", "Use --help or -h to list all arguments")
("file", value<string>(), "Provide input file name")
("level", value<int>(& nLevel)->default_value(5);

其中,长选项名(比如“help”)必须在前面,短选项名(比如“h“)可有也可没有,如果有,必须紧跟在逗号之后。另外,还可以给选项名赋默认值。
添加好选项名字之后,就可以开始解析工作了。解析的结果保存在variables_map类型的对象中。

variables_map vmap;
// MFC中使用__argc和__argv
store(parse_command_line(argc, argv, myOptions), vmap);
notify(vmap);

其中,store函数可以调用多次,以将多个不同options_description的分析结果存入vmap中。解析工作完成之后,解析的结果就保存在vmap中。我们现在可以从vmap中获取想要的选项值了。

if (vmap.count("help"))
{
cout << myOptions << endl; // 打印出使用帮助
}
if (vmap.count("file"))
{
cout << "file is " << vmap["file"].as ( ) << endl;
}
cout << "level is " << nLevel << endl;

必须使用as来获得选项值;如果类型不符和,program_options会抛出异常。
总结一下,从上面的介绍可以看出,使用program_options来解析命令行还是非常方便的,推荐大家使用。

没有评论:

发表评论