命令行接受如下三种参数形式,以及不带 para 的 positional parameter
--para=value
--para value
-p value
例如
gcc -I /inclue main.c
main.c 为 positional parameter
文件接受的形式为
para = value
注释以#开头
注意文件不能为 utf8 格式
一个参数,如果类型是 vector<> 可以设置多个 value,存在 vector 中。
命令行解析和文件解析不属于多次设置,算两次解析。一般先解析命令行,则如果同一个参数在命令行中和文件中都出现,命令行中的有效,如此保证命令行优先级比较高。
以上的例外是,vector 且调用 composing 函数,则为融合。
positional 是附加选择,必选先定义参数,再将此参数定义为 positional
positional 也可以通过前面提到的命令行和文件形式赋值
例子,基本涵盖了平常的需求
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <boost/program_options.hpp>
using namespace std;
namespace po = boost::program_options;
void procImage(double scale, int level, const vector<string>& images)
{
vector<string>::const_iterator iter;
for(iter=images.begin();iter!=images.end();++iter)
{
cout << "Processing image " << *iter << " @ scale " << scale << ", level " << level
<< endl;
}
}
int main(int ac, char * av[])
{
po::options_description cfgdesc;
//user defined parameters
double scale;
int level;
//end
string filename;
//options for both command line and config file
cfgdesc.add_options()
("scale,s",po::value<double>(&scale)->default_value(3.0),"scale")
("level,l",po::value<int>(&level)->default_value(2),"level")
("image,i",po::value<vector<string> >()->composing(),"Images");
//positional options
po::positional_options_description pdesc;
pdesc.add("image",-1);
//command line options
po::options_description cmdline;
cmdline.add_options()
("help,h","Show this message")
("config,c",po::value<string>(&filename),"Config File");
cmdline.add(cfgdesc);
po::variables_map vm;
po::store(po::command_line_parser(ac,av).options(cmdline).positional(pdesc).run(),vm);
po::notify(vm);
ifstream cfgfile(filename.c_str());
try
{
if(cfgfile)
{
po::store(po::parse_config_file(cfgfile,cfgdesc),vm);
po::notify(vm);
}
}
catch(exception &e)
{
cout << e.what() << endl;
}
if(vm.count("help"))
{
cout << cmdline << endl;
}
if(vm.count("image"))
{
procImage(scale, level, vm["image"].as<vector<string> >());
}
return 0;
}
0 comments:
Post a Comment