boost:program_options
由于系统库getopt和getopt_long用起来不够直观,仔细看了下boost发现Boost.Program_options可以满足我的需求,它和getopt系列函数一样,可以抓起命令行参数,这里写下我对Boost.Program_options的理解。
一、getopt的不足
使用过了getopt函数后,我感觉它不足的地方(可能是我没研究明白的问题),我觉得getopt系列函数的不足有下面几点:
1、使用switch-case语句,导致程序看起来不是太美观,不怎么好看
2、没法使用一个参数接受N个值,如-a 1 2 3 4..n -b..这样
3、程序里变量的控制,只是一些自己定义的字符(如v,h等等),只有程序设计的人才知道这些字符代表的什么意思,做不到一目了然,与现代程序设计不符合
当然getopt也有自己优势,这里就不再罗嗦,直接开始boost命令行参数。
二、使用前准备
当然我们在使用boost库时,需要安装boost库,这里也不再罗嗦,自己上网搜索,很简单。在使用的时候,我们要首先引入头文件:#include <boost/program_options.hpp>,同时不要忘记了要使用该boost库的命名空间:boost::program_options
三、实战
由于boost库的写法比较怪异,跟我们平常的写法有所区别,最好先把程序运行下,然后再看程序,能够很快理解程序的意思,下面的例子由易到难。
例子1
- #include<iostream>
- #include <boost/program_options.hpp>
- using namespace std;
- using namespace boost::program_options;
- int main(int argc, char **argv)
- {
- options_description desc("Allowed options");
- desc.add_options()
- ("help", "produce help message")
- ("compression", value<int>(), "set compression level")
- ;
- variables_map vm;
- store(parse_command_line(argc, argv, desc), vm);
- notify(vm);
- if (vm.count("help")) {
- cout << desc << "\n";
- return ;
- }
- if (vm.count("compression")) {
- cout << "Compression level was set to " << vm["compression"].as<int>() << ".\n";
- } else {
- cout << "Compression level was not set.\n";
- }
- }
编译:g++ -L/usr/local/lib -lboost_program_options
结果:./a.out --help
Allow options:
--help produce help message
--compresion arg set compression level
./a.out --compression 10
Compression level was set to 10
上面的例子我们只是演示的只有int类型,还可以有其他的类型,同时上面的例子,也是无法做到一个参数后跟N个值,下面就说怎么解决这个问题
例子2
- #include<iostream>
- #include <boost/program_options.hpp>
- using namespace std;
- using namespace boost::program_options;
- int main(int argc, char **argv)
- {
- int opt;
- options_description desc("Allowed options");
- desc.add_options()
- ("help", "produce help message")
- ("compression", value<int>(), "set compression level")
- ("optimizaiton", value<int>(&opt)->default_value(), "optimization level")
- ("input-file,i", value<vector<string>>(), "input file")//这里注意input-file和i之间不能有空格
- ("include-path", value<vector<int>>(), "include path")
- ;
- //note here
- positional_options_description p;
- p.add("include-path“, -1)
- //这里只会有一个生效,就是后面的那个,他会把命令行中哪些没有参数值默认为
- //你这里设置的值
- //p.add("include-path", -1)
- variables_map vm;
- store(command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
- notify(vm);
- if (vm.count("help")) {
- cout << desc << "\n";
- return ;
- }
- if (vm.count("compression")) {
- cout << "Compression level was set to " << vm["compression"].as<int>() << ".\n";
- }
- if (vm.count("include-path")) {
- for (auto& v: vm["include-path"].as<vector<int>>()) {
- cout << "include-path: " << v << endl;
- }
- }
- if (vm.count("input-file")) {
- for (auto &v : vm["input-file"].as<vector<string>>()) {
- cout << "input-file: " << v << endl;
- }
- }
- }
测试结果:
./a.out --compression 10 -i a.cpp --include-path 10 20 40
- Compression level was set 10.
input-file: a.cpp
include-path: 10
include-path: 20
include-path: 40
- 下面介绍多个options_description之间的配合使用,这样让你的程序更加专业化
- #include<iostream>
- #include <boost/program_options.hpp>
- #include <string>
- #include <vector>
- using namespace std;
- using namespace boost::program_options;
- int main(int argc, char **argv)
- {
- options_description generic("Generic options");
- generic.add_options()
- ("version,v", "print version string")
- ("help,h", "produce help message")
- ;
- int opt = ;
- options_description config("Configuration");
- config.add_options()
- ("optimization", value<int>(&opt)->default_value(), "optimization level")
- ("include-path,I", value<string>(),"include path")
- ("compression", value<int>(), "compression")
- ;
- options_description hidden("Hidden options");
- hidden.add_options()
- ("input-file", value<vector<string>>(), "input file")
- ;
- options_description cmdline_options("Allow options");
- cmdline_options.add(generic).add(config).add(hidden);
- positional_options_description p;
- p.add("input-file", -);
- variables_map vm;
- store(parse_command_line(argc, argv).
- options(cmdline_options).positional(p).run(), vm);
- notify(vm);
- if (vm.count("help")) {
- cout << desc << "\n";
- return ;
- }
- if (vm.count("compression")) {
- cout << "Compression level was set to " << vm["compression"].as<int>() << ".\n";
- }
- if (vm.count("input-file")) {
- for (auto &v : vm["input-file"].as<vector<string>>()) {
- cout << "input-file: " << v << endl;
- }
- }
- }
- 结果:
- Allow options:
- Generic options:
-v [--version] print version string
-h [--help] produce help message- Configuration:
--optimization arg(=10) optimization level
-I [ --include-path ] arg include path
--compression arg compression- Hidden options:
--input-file args input file
- 下面尽可能解释一下,程序中的难点,解释不对的地方欢迎指正~
1、
- 欢迎转载,但是请指明出处以及作者,谢谢~
boost:program_options的更多相关文章
- 使用Boost program_options控制程序输入
简介 很多人使用界面来输入数据,本文的程序介绍如何使用Boost的program_options控制输入. 程序中使用了: 1. 短选项 2. 可以指定多个参数的选项 程序 #include < ...
- boost::program_options 解析命令行参数
源码: #include <boost/program_options.hpp> namespace po = boost::program_options; int main(int a ...
- Boost命令行解释器的简单使用:Boost.Program_options
简介 如果使用比较多的命令行程序的话,对于命令行参数的输入肯定不会陌生,大部分的程序都是通过类似下面的形式进行输入的,比如熟悉的ls ls --all -l --color=auto 这里面包含了三种 ...
- [C++Boost]程序参数项解析库Program_options使用指南
介绍 程序参数项(program options)是一系列name=value对,program_options 允许程序开发者获得通过命令行(command line)和配置文件(config fi ...
- boost之program_options库,解析命令行参数、读取配置文件
一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...
- boost库中的 program_options
1.阅读rviz中的源码时在rviz/visualizer_app.cpp中遇到如下代码: po::options_description options; options.add_options() ...
- boost::xml——基本操作以及中文乱码解决方案
下面是本人使用boost库的xml部分的基础操作,并且解决对于大家使用boost库读写中文xml内容出现的乱码问题. 1.实现boost库xml基本操作2.解决boost对xml中中文乱码问题3.实现 ...
- boost::xml——基本操作以及中文乱码解决方案 (续)
本博文主要想说明以下两点: 1.对于上一篇的<boost::xml——基本操作以及中文乱码解决方案>解释,这篇博文基本解决了正确输入输出中英文问题,但是好像还没有解决修改中文出现乱码的问题 ...
- program_options禁止命令行短参数
典型的 boost program_options的用法如下: #include <boost/program_options.hpp> using namespace boost::pr ...
随机推荐
- 用shell获取文件大小
ls -l filename | awk '{ print $5,$9 }' ls -l filename | awk '{ print $5 }'
- Android系统中设置TextView等的行间距
1.android:lineSpacingExtra 设置行间距,如”2dp”. 2.android:lineSpacingMultiplier 设置行间距的倍数,如”2″.
- uiview 的setAnimationTransition : forView 方法实现翻页效果
[UIView beginAnimations:nil context:nil]; [UIView setAnimationTransition:UIViewAnimationTransitionCu ...
- 通过layer的contents属性来实现uiimageview的淡入切换
#import "ViewController.h" @interface ViewController () @property(nonatomic,strong)CALayer ...
- [SEO] 网站标题分隔符
标题用什么分隔符对SEO最有利 我们在看同行的朋友对网站标题优化时,关键词分按照主次的顺序进行分布,在网站标题或者是关键词之间都会有一个符号,俗话来讲就称为关键词分隔符,网站标 题分隔符分为“-”(横 ...
- 深入理解HTTPS通讯原理
一.HTTPS简介 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),简单来讲就是加了安全的HTTP,即HTTP+SSL:我们知 ...
- [转]Web Services使用out参数
本文转自:http://www.cnblogs.com/zhaozhan/archive/2010/10/25/1860837.html Web Services使用out参数,在SOAP协议中会跟返 ...
- angular-ui-router state.go not passing data to $stateParams
app.js中定义了一个state如下,url接收一个id参数 $stateProvider.state("page.details", { url: "/details ...
- 四舍五入PK银行四舍五入
描述 在实际开发中decimal.Round(1.23525,4)!=1.2353实际是1.2352,而decimal.Round(1.23535,4)==1.2354 说明 四舍五入:当舍去位的数值 ...
- OpenShare:前所未有的开放性
客户总是面临一个选择:开放的企业门户产品 vs 封闭的企业门户产品 市场上大多数企业门户产品是自成一体的其实也就是封闭的,他们不能和企业目录集成,不能和Exchange集成,不能和SAP集成,不能和L ...