由于系统库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的更多相关文章

  1. 使用Boost program_options控制程序输入

    简介 很多人使用界面来输入数据,本文的程序介绍如何使用Boost的program_options控制输入. 程序中使用了: 1. 短选项 2. 可以指定多个参数的选项 程序 #include < ...

  2. boost::program_options 解析命令行参数

    源码: #include <boost/program_options.hpp> namespace po = boost::program_options; int main(int a ...

  3. Boost命令行解释器的简单使用:Boost.Program_options

    简介 如果使用比较多的命令行程序的话,对于命令行参数的输入肯定不会陌生,大部分的程序都是通过类似下面的形式进行输入的,比如熟悉的ls ls --all -l --color=auto 这里面包含了三种 ...

  4. [C++Boost]程序参数项解析库Program_options使用指南

    介绍 程序参数项(program options)是一系列name=value对,program_options 允许程序开发者获得通过命令行(command line)和配置文件(config fi ...

  5. boost之program_options库,解析命令行参数、读取配置文件

    一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...

  6. boost库中的 program_options

    1.阅读rviz中的源码时在rviz/visualizer_app.cpp中遇到如下代码: po::options_description options; options.add_options() ...

  7. boost::xml——基本操作以及中文乱码解决方案

    下面是本人使用boost库的xml部分的基础操作,并且解决对于大家使用boost库读写中文xml内容出现的乱码问题. 1.实现boost库xml基本操作2.解决boost对xml中中文乱码问题3.实现 ...

  8. boost::xml——基本操作以及中文乱码解决方案 (续)

    本博文主要想说明以下两点: 1.对于上一篇的<boost::xml——基本操作以及中文乱码解决方案>解释,这篇博文基本解决了正确输入输出中英文问题,但是好像还没有解决修改中文出现乱码的问题 ...

  9. program_options禁止命令行短参数

    典型的 boost program_options的用法如下: #include <boost/program_options.hpp> using namespace boost::pr ...

随机推荐

  1. C#操作SQL Server通用类

    using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...

  2. Ubuntu下VSFTPD(五)(匿名FTP设置方法)

    匿名FTP设置方法: 通常在登录FTP服务器的用户不确定的情况下,应将FTP服务器设置为允许匿名账号登录的FTP服务器 1.启用匿名帐号   anonymous_enable=YES   local_ ...

  3. Replace INTO与INSERT INTO的不同之处

    Replace INTO和INSERT INTO的区别: REPLACE的运行与INSERT很相似.只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有 ...

  4. js中数组操作

    var selectedCodeArray = []; var num = $.inArray(值, selectedCodeArray)  //值在数组中的位置 selectedCodeArray. ...

  5. C# 自定义重绘DataGridView

    using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using Syste ...

  6. Web安全 之 SQL注入

    随着B/S模式应用开发的发展,使用这种模式编写的应用程序也越来越多.相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,根据 ...

  7. Linux与Windows文件传输实现

    Linux与Windows文件传输实现 一.概述 在学习Linux服务器的时候,我们有时需要与Windows下的文件进行交互传输,这个时候我们需要如何实现呢?今天是我第一次在博客园上写文章,此时正值学 ...

  8. Java基础--访问权限控制符

    今天我们来探讨一下访问权限控制符. 使用场景一:攻城狮A编写了ClassA,但是他不想所有的攻城狮都可以使用该类,应该怎么办? 使用场景二:攻城狮A编写了ClassA,里面有func1方法和func2 ...

  9. 隐藏自定义的tabbar之后,push到B视图,B视图的键盘工具条无法响应点击事件

    我的情况如下: 在TabbarViewController中隐藏了系统的tabbar,然后自定义tabbar,A B C D 4个视图都有UINavigationController,A视图 使用的是 ...

  10. poj动态规划列表

    [1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...