引言
命令行參數(shù)配置是一個(gè)很重要的功能,因?yàn)樗軒椭脩舾臃奖愕呐c程序參數(shù)進(jìn)行交互,而且易于編寫腳本文件來(lái)控制程序。我想大家都不愿意修改幾個(gè)參數(shù)佛点,還得打開Visual Studio或者源代碼去修改參數(shù)然后再重新編譯這么麻煩吧 :(
Boost庫(kù)中的 program_options
可以很方便的形成命令行參數(shù)配置,下面是一個(gè)30分鐘黎比,快速掌握 program_options 的教程超营。
program_options的組成成分
program_options庫(kù)由三個(gè)部分構(gòu)成:1.選項(xiàng)描述器;2.分析器阅虫;3. 存儲(chǔ)器糟描。
Part 1 選項(xiàng)描述器
作用:定義選項(xiàng)及選項(xiàng)的值。
我們經(jīng)常見(jiàn)到的命令行书妻,比如 ./demo --help
中--help
就是一個(gè)選項(xiàng)船响,它的值是空的躬拢。對(duì)這個(gè)選項(xiàng)進(jìn)行描述的部分就叫選項(xiàng)描述器。
常用語(yǔ)句:
options_description T; // 定義選項(xiàng)描述器
T.add_option()("help,h", "Help message"); // 添加選項(xiàng)
T.add_option()("file,f", value<string>(), "to find a file"); // 添加選項(xiàng)
T.add(T1).add(T2); // 添加選項(xiàng)描述器
Part 2 分析器
作用:解析命令行见间。
常用語(yǔ)句:
command_line_parser(argc, argv).options(cmd_options).run()
Part 3 存儲(chǔ)器
作用:把分析器分析的結(jié)果保存成程序中的變量聊闯。
常用語(yǔ)句:
variables_map vm; // 定義存儲(chǔ)器
store( 分析器 , vm); // 存儲(chǔ)分析結(jié)果
notify(vm); // 更新存儲(chǔ)器 vm
vm["file"].as<std::string>() // 得到選項(xiàng)--file的選項(xiàng)值
舉個(gè)例子:
//example.cpp
#include <iostream>
#include "boost\program_options.hpp"
using namespace boost::program_options;
int main(int argc, char** argv)
{
options_description opts; // <--- 選項(xiàng)描述器
opts.add_options()("help", "Help message"); // <--- 添加選項(xiàng)
options_description fileopts; // <--- 選項(xiàng)描述器
fileopts.add_options()("file", value<std::string>(), "to find a file"); // <--- 添加選項(xiàng)
options_description cmd_options; // <--- 選項(xiàng)描述器
cmd_options.add(opts).add(fileopts); // <--- 添加選項(xiàng)描述器
variables_map vm; // <--- 定義存儲(chǔ)器
store(command_line_parser(argc, argv).options(cmd_options).run(), vm);
// <--- (1) store: 存儲(chǔ)分析結(jié)果 (2) command_line_parser: 分析器
notify(vm); // <--- 更新存儲(chǔ)器 vm
if (vm.count("help")) { // 如果在存儲(chǔ)器中找到選項(xiàng) help,則輸出所有選項(xiàng)列表
std::cerr << cmd_options << std::endl;
return 1;
}
if (vm.count("file")) { // 如果在存儲(chǔ)器中找到選項(xiàng) file米诉,則輸出 file 的文件名
std::cout << "find " << vm["file"].as<std::string>() << std::endl;
}
return 0;
}
比如用 Visual Studio IDE 來(lái)運(yùn)行
- 新建一個(gè)項(xiàng)目 New > Project
- 選擇win32控制臺(tái) Visual C++ > Win32
- 建立一個(gè)名為 “example” 的項(xiàng)目
- 在項(xiàng)目屬性 Properties 中添加包含目錄 Configuration Properties > C/C++ > General > Additional Include Directories菱蔬,例如 D:\Program Files\boost\boost_1_62_0
- 更改配置 將 Configuration Properties > C/C++ > Precompiled Headers 從 Use Precompiled Header (/Yu) 改為 Not Using Precompiled Headers。
- 添加庫(kù)目錄 Configuration Properties > Linker > Additional Library Directories史侣,例如 D:\Program Files\boost\boost_1_62_0\stage\lib
- 將寫好的
example.cpp
添加到項(xiàng)目的源文件中 - 最后 build example拴泌,再 bulid solution
- 打開 DOS 命令行,修改當(dāng)前目錄為
example.exe
所在的 Debug 文件夾
運(yùn)行結(jié)果:
example --help
example options:
--help Help message
--file arg to find a file
example --file=abc.txt
find abc.txt
親自跑一遍這個(gè)程序惊橱,您就學(xué)會(huì)了 :)
參考文獻(xiàn):
[1] 羅劍鋒 《Boost 程序庫(kù)完全開發(fā)指南(第3版)》 2015. P428-445