program_options 命令行参数解析

简介

program options是一系列pair<name,value>组成的选项列表,它允许程序通过命令行或配置文件来读取这些参数选项。

主要组件

program_options的使用主要通过下面三个组件完成:

组件名 作用
options_description(选项描述器) 描述当前的程序定义了哪些选项
parse_command_line(选项分析器) 解析由命令行输入的参数
variables_map(选项存储器) 容器,用于存储解析后的选项

示例

本示例提供帮助(--help)、日志存储文件(--log)和配置文件(--config)配置,未指定参数前缀时,第一个参数为--config,第二个为--log

#include<iostream>
#include<boost/program_options.hpp>

using namespace std;
namespace po = boost::program_options;

int main(int argc, const char *argv[]) {
    string config_file;
    string log_file;
    po::options_description desc("options");  // 选项描述器,其参数为该描述器的名字
    // 为选项描述器增加选项
    desc.add_options()
            ("help,h", "print help message")
            ("config,c", po::value<string>(&config_file)->default_value("config.json")->value_name("CONFIG"), "specify config file")
            ("log,l", po::value<string>(&log_file)->value_name("LOG"), "specify log file location");
    // 添加位置选项
    po::positional_options_description pd;
    pd.add("config", 1);
    pd.add("log", 2);
    po::variables_map vm;  // 选项存储器,继承自map容器
    try {
        // 对命令行输入参数进行解析,并存入选项存储器
        po::store(po::command_line_parser(argc, argv).options(desc).positional(pd).run(), vm);
    } catch(...) {
        cerr << "There are undefined options in the parameters entered." << endl;
        return 1;
    }
    // 参数解析完成后,通知variables_map去更新所有的外部变量
    po::notify(vm);
    // 检测某个值
    if (vm.count("help")) {
        cout << "usage: " << argv[0] << " [-h] [[-l] LOG] [[-c] CONFIG]" << endl;
        cerr << desc;
        exit(EXIT_SUCCESS);
    }
    if (vm.count("log")) {
        cout << "log" << log_file << endl;
    }
    if (vm.count("config")) {
        cout << "config: " << config_file << endl;
    }
    return 0;
}

这样,参数解析是不是变得很简单?boost真是一个宝库,以后要多加利用。