Boost命令行解释器的简单使用:Boost.Program_options
简介
如果使用比较多的命令行程序的话,对于命令行参数的输入肯定不会陌生,大部分的程序都是通过类似下面的形式进行输入的,比如熟悉的ls
ls --all -l --color=auto
这里面包含了三种不同的命令行输入--all
,-l
和--color=auto
。如果使用一般的解决方法的话,是使用getopt.h
文件中的getopt
函数。其具体的教程可以看《Linux下getopt()函数的简单使用》,其使用方法比较麻烦。而且只支持一个字符的选项,如果要像--color=auto
一样支持长选项,必须再使用getopt_long
函数,而且由于其是对C进行支持的,所以在C++中使用起来也比较麻烦。
而Boost提供的Program_options库可以很好的解决这一问题。Program_options提供了一个成熟的C++库来解析命令行参数,几行简单清晰的代码就可以描绘出一个完整的命令行解析器。
而其的使用方法也是非常的简单,大致可以分为三个部分,构建解析器对象,解析命令行参数,使用结果。
使用的时候需要链接boost_program_options库
没有参数的选项
一个非常简单的例子,只定义了一个选项help
,运行时会直接先打印获取到的var_map
的name
,然后检查是否存在help
选项,如果存在则打印命令行帮助,如果不存在,就直接推出。
#include <boost/program_options.hpp>
#include <iostream>
#include <string>
#include <vector>
int main(int argc, char *argv[]) {
boost::program_options::options_description desc("测试程序");
desc.add_options()("help,h", "打印帮助文档");
boost::program_options::variables_map var_map;
boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), var_map);
boost::program_options::notify(var_map);
for (auto iter : var_map) {
std::cout << iter.first << std::endl;
}
if (var_map.count("help") > 0) std::cout << desc << std::endl;
return 0;
}
编译以后运行./main_simple -h
或者./main_simple --help
可以得到:
help
测试程序:
-h [ --help ] 打印帮助文档
首先是定义了一个boost::program_options::options_description
对象,它可以选项列表的描述。它的构造函数可以传入一个字符串,作为打印时候的抬头。
然后是向选项列表里面添加选项,最简单的方法就是使用desc
对象里面的add_options
方法,它可以返回一个函数对象,借此向选项列表描述添加选项。
目前在这里的选项列表只有简单的两个参数,第一个是表明选项的name
,你可以通过用分号将长选项和缩写分割开来,而最终的结果还是以长选项作为name
的;第二个是对选项的描述。
然后定义了一个boost::program_options::variables_map
对象,它是一个map
,key元素为选项的name
,value元素为Boost::any
对象。
然后开始对命令行输入进行解析,首先使用boost::program_options::parse_command_line
进行解析,然后使用boost::program_options::store
将结果保存在var_map
变量里面。
接下来,就是对map
的操作了。而如果想输出说明的话,也可以很直接的直接对desc
进行cout
。
带参数的选项
上面我们介绍了不带参数的简单使用,但是在很多的时候,我们需要通过命令行输入一些参数。就如同最上面例子中的--color=auto
一样。Boost提供了非常简单的方法来实现这一操作。
#include <vector>
#include <string>
#include <iostream>
#include <boost/program_options.hpp>
int main(int argc, char *argv[]) {
boost::program_options::options_description desc("测试程序");
desc.add_options()("help,h", "打印帮助文档");
desc.add_options()("input,i", boost::program_options::value<std::string>()->default_value("Test")->value_name("string"), "输入");
boost::program_options::variables_map var_map;
boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), var_map);
boost::program_options::notify(var_map);
if (var_map.count("help") > 0) std::cout << desc << std::endl;
if (var_map.count("input") > 0) std::cout << var_map["input"].as<std::string>() << std::endl;
return 0;
}
在这个程序中,增加了一行
desc.add_options()("input,i", boost::program_options::value<std::string>()->default_value("Test")->value_name("string"), "输入");
和之前的help
选项类似,在这里我们增加了一个input
选项,在这个添加过程中,我们向函数对象添加了3个参数,第一个和第三个参数和之前表述的一样。而第二个参数可以看作是对输入的描述。
首先我们通过boost::program_options::value
构造了一个对象,在构造的过程中,需要向模板传入一个类型参数,表表明输入值的类型。然后其会构造出一个boost::program_options::type_value
类型,可以通过一些方法对其进行设置。
在这一示例中,用户可以在input
后面输入一个字符串,同时如果没有输入的话,会主动出现一个默认值Test
,这个默认值会在没有输入的时候作为input
项的默认值。
然后可以通过对var_map
进行简单的操作,来获取输入的值。
其他杂项
很明显,Boost.Program_options的操作肯定还不止这一些,但是以上的简单操作,基本上可以覆盖大部分的使用场景了。然后还有一些使用的小细节。
报错
如果输入的选项中存在描述中没有的选项的话,就会在解析的时候产生一个异常,可以通过捕捉这一个异常,给程序一个更加合理的表现。
隐藏项
如果想给程序增加一个“后门”,只有你知道的选项,应该如何操作呢?
其实很简单,建立两个options_description
就好了,一个用来显示,一个用来解析。这样就不会在显示的时候,显示需要隐藏的项了。
转载注明源地址://www.cnblogs.com/ink19/p/Boost_Program_options.html