快速掌握 命令行參數(shù)配置——program_options

引言

命令行參數(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 HeadersUse 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末榄鉴,一起剝皮案震驚了整個(gè)濱河市遍烦,隨后出現(xiàn)的幾起案子怠惶,更是在濱河造成了極大的恐慌瘩燥,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件正林,死亡現(xiàn)場(chǎng)離奇詭異泡一,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)觅廓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門鼻忠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人杈绸,你說(shuō)我怎么就攤上這事帖蔓。” “怎么了蝇棉?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵讨阻,是天一觀的道長(zhǎng)芥永。 經(jīng)常有香客問(wèn)我篡殷,道長(zhǎng),這世上最難降的妖魔是什么埋涧? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任板辽,我火速辦了婚禮,結(jié)果婚禮上棘催,老公的妹妹穿的比我還像新娘劲弦。我一直安慰自己,他們只是感情好醇坝,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布邑跪。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪画畅。 梳的紋絲不亂的頭發(fā)上砸琅,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音轴踱,去河邊找鬼症脂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛淫僻,可吹牛的內(nèi)容都是我干的诱篷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼雳灵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼棕所!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起细办,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤橙凳,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后笑撞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岛啸,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年茴肥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坚踩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓤狐,死狀恐怖瞬铸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情础锐,我是刑警寧澤嗓节,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站皆警,受9級(jí)特大地震影響拦宣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜信姓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一鸵隧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧意推,春花似錦豆瘫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)育灸。三九已至,卻和暖如春昵宇,著一層夾襖步出監(jiān)牢的瞬間描扯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工趟薄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绽诚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓杭煎,卻偏偏與公主長(zhǎng)得像恩够,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羡铲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理蜂桶,服務(wù)發(fā)現(xiàn),斷路器也切,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • 轉(zhuǎn)自http://blog.csdn.net/xugangwen/article/details/44811783...
    扎Zn了老Fe閱讀 12,693評(píng)論 1 142
  • 夏威夷火山國(guó)家公園在夏威夷東部扑媚,離國(guó)際機(jī)場(chǎng)很遠(yuǎn),駕車大概三個(gè)多小時(shí)雷恃,周圍住宿很少疆股,比較偏僻荒涼,我們找了個(gè)美國(guó)農(nóng)家...
    柳上惠2閱讀 252評(píng)論 0 0
  • 程序計(jì)數(shù)器 java虛擬機(jī)中多線程時(shí)通過(guò)線程輪流切換并分配處理器執(zhí)行時(shí)間的方式來(lái)實(shí)現(xiàn)的倒槐,在任何一個(gè)確定的時(shí)刻旬痹,一個(gè)...
    螢火之森ss閱讀 114評(píng)論 0 1