青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 24,  comments - 62,  trackbacks - 0

介紹

命令行接口是普遍,基礎的人機交互接口,從命令行提取程序的運行時選項的方法有很多。你可以自己編寫相對應的完整的解析函數,或許你有豐富的C語言編程經驗,熟知getopt()函數的用法,又或許使用Python的你已經在使用optparse庫來簡化這一工作。大家在平時不斷地談及到“不要重復造輪子”,那就需要掌握一些順手的庫,這里介紹一種C++方式來解析命令行選項的方法,就是使用Boost.Program_options庫。

program_options提供程序員一種方便的命令行和配置文件進行程序選項設置的方法。使用program_options庫而不是你自己動手寫相關的解析代碼,因為它更簡單,聲明程序選項的語法簡潔,并且庫自身也非常小。將選項值轉換為適合的類型值的工作也都能自動完成。庫有著完備的錯誤檢查機制,如果自己手寫解析代碼時,就可能會錯過對一些出錯情況的檢查了。最后,選項值不僅能從命令行獲取,也能從配置文件,甚至于環境變量中提取,而這些選擇不會增加明顯的工作量。

示例說明

以下面簡單的hello程序進行說明,默認打印hello world,如果傳入-p選項,就會打印出人的姓名,另外通過傳入-h選項,可以打印出幫助選項。略微看一眼代碼文件和相應的屏幕輸入輸出,然后我們再一起來看看這些是如何發生的。

//hello.cpp 
#include <iostream>
#include <string>
#include <boost/program_options.hpp>

using namespace std;
int main(int argc, char* argv[])
{
    using namespace boost::program_options;
    //聲明需要的選項
    options_description desc("Allowed options");
    desc.add_options()
        ("help,h", "produce help message")
        ("person,p", value<string>()->default_value("world"), "who")
        ;

    variables_map vm;        
    store(parse_command_line(argc, argv, desc), vm);
    notify(vm);    

    if (vm.count("help")) {
        cout << desc;
        return 0;
    }
    cout << "Hello " << vm["person"].as<string>() << endl;
    return 0;
}

下面是在Windows命令提示符窗口上的輸入輸出結果,其中">"表示提示符。

>hello 
Hello world

>hello -h
Allowed options:
  -h [ --help ]                produce help message
  -p [ --person ] arg (=world) who

>hello --person len
Hello len

首先通過options_description類聲明了需要的選項,add_options返回了定義了operator()的特殊的代理對象。這個調用看起來有點奇怪,其參數依次為選項名,選項值,以及選項的描述。注意到示例中的選項名為"help,h",是因為聲明了具有短選項名和長選項名的選項,這跟gnu程序的命令行具有一致性。當然你可以省略短選項名,但是這樣就不能用命令選項簡寫了。第二個選項的聲明,定義了選項值為string類型,其默認值為world.

接下來,聲明了variables_map類的對象,它主要用來存儲選項值,并且能儲存任意類型的值。然后,store,parse_command_line和notify函數使vm能存儲在命令行中發現的選項。

最后我們就自由地使用這些選項了,variables_map類的使用就像使用std::map一樣,除了它必須用as方法去獲取值。如果as方法調用的指定類型與實際存儲的類型不同,就會有異常拋出。

具有編程的你可能有這樣的經驗,使用cl或gcc對源文件進行編譯時,可直接將源文件名放置在命令行中,而無需什么選項字母,如gcc a.c之類的。prgram_options也能處理這種情況,在庫中被稱為"positional options"(位置選項),但這需要程序員的一點兒幫助才能完成。看下面的經過對應修改的代碼,我們無需傳入"-p"選項,就能可指定"person"選項值

    positional_options_description p;
    p.add("person", -1);
    store(command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
>hello len
Hello len

前面新增的兩行是為了說明所有的位置選項都應被解釋成"person"選項,這里還采用了command_line_parser類來解析命令行,而不是用parse_command_line函數。后者只是對前者類的簡單封裝,但是現在我們需要傳入一些額外的信息,所以要使用類本身。

選項復合來源

一般來說,在命令行上指定所有選項,對用戶來說是非常煩人的。如果有些選項要應用于每次運行,那該怎么辦呢。我們當然希望能創建出帶有些常用設置的選項文件,跟命令行一起應用于程序中。當然這一切需要將命令行與配置文件中的值結合起來。比如,在命令行中指定的某些選項值應該能覆蓋配置文件中的對應值,或者將這些值組合起來。

下面的代碼段將選項通過文件讀取,這文件是文本格式,可用"#"表示注釋,格式如命令行中的參數一樣,選項=值

    ifstream ifs("config.cfg");
    store(parse_config_file(ifs,config),vm);
    notify(vm);

參考

Boost.prgram_options庫文檔

posted on 2008-06-15 21:03 len 閱讀(13663) 評論(0)  編輯 收藏 引用 所屬分類: 程序開發

<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久久久综合| 久久夜色精品| 国产精品一国产精品k频道56| 亚洲视频免费在线| 99精品热6080yy久久| 欧美性猛交xxxx乱大交退制版| 亚洲午夜在线| 午夜在线成人av| 亚洲国产黄色片| 亚洲精品日韩在线| 国产女人18毛片水18精品| 久久久久久9999| 你懂的视频欧美| 亚洲一级高清| 欧美在线观看www| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲天堂偷拍| 夜夜嗨av一区二区三区| 国产片一区二区| 欧美国产国产综合| 欧美日韩国产经典色站一区二区三区| 亚洲视屏在线播放| 欧美亚洲三区| 一个人看的www久久| 午夜精彩视频在线观看不卡| 在线观看免费视频综合| 亚洲美女黄色| 激情欧美日韩| 99pao成人国产永久免费视频| 国产精品视频一| 亚洲高清不卡在线| 国产精品综合色区在线观看| 欧美激情精品久久久久久蜜臀| 欧美日韩在线第一页| 久久综合给合久久狠狠色| 欧美激情在线有限公司| 久久久久久一区| 欧美日韩免费一区二区三区| 久久一二三区| 国产久一道中文一区| 亚洲激情视频网| 在线观看一区视频| 亚洲欧美一区二区三区久久| 99热这里只有成人精品国产| 久久久爽爽爽美女图片| 午夜精品在线观看| 欧美日韩直播| 亚洲欧洲在线视频| 亚洲激情中文1区| 久久久欧美一区二区| 欧美专区亚洲专区| 国产精品久久久久9999吃药| 亚洲精品日韩在线| 最新中文字幕亚洲| 久久久久久69| 久久免费偷拍视频| 国产一区在线免费观看| 午夜亚洲视频| 欧美在线免费视频| 国产裸体写真av一区二区| 亚洲先锋成人| 亚洲欧美日韩综合国产aⅴ| 欧美视频亚洲视频| 一区二区三区导航| 亚洲夜晚福利在线观看| 欧美日韩在线观看视频| 亚洲毛片网站| 亚洲伊人网站| 国产精品影视天天线| 日韩视频在线一区二区| av成人黄色| 国产精品久久久久久久久借妻| 99综合精品| 欧美一区二区三区免费大片| 国产女主播在线一区二区| 欧美一区二区精美| 久久免费99精品久久久久久| 国内自拍一区| 欧美成人一区在线| 日韩视频免费观看| 性做久久久久久久久| 国产一区视频观看| 久久综合伊人77777麻豆| 欧美激情无毛| 亚洲小说区图片区| 国产日韩欧美一区二区三区在线观看 | 久久久综合精品| 欧美国产日韩xxxxx| 9久re热视频在线精品| 欧美先锋影音| 久久成人免费视频| 最新国产成人在线观看| 午夜精品视频在线| 好看的av在线不卡观看| 麻豆成人综合网| 一区二区免费在线观看| 欧美一级免费视频| 亚洲国内自拍| 国产精品嫩草久久久久| 久久久久久亚洲精品中文字幕| 亚洲国产日韩欧美一区二区三区| 亚洲免费高清| 国产一区二区三区在线观看网站 | 久久国产精品99国产| 亚洲第一区色| 亚洲欧美在线播放| 亚洲国产成人porn| 国产精品久久久久高潮| 麻豆精品传媒视频| 亚洲一区视频在线| 欧美激情一二三区| 欧美在线一区二区| 一区二区欧美视频| 亚洲成人原创| 国产女主播一区| 欧美日韩不卡一区| 久久久久久久尹人综合网亚洲 | 久久久久在线观看| 一区二区三区四区五区精品| 好看不卡的中文字幕| 欧美日韩亚洲一区三区| 美女国内精品自产拍在线播放| 亚洲女人天堂成人av在线| 亚洲国产欧美一区二区三区久久| 欧美综合国产| 午夜精品久久久久久99热| 亚洲精品国产无天堂网2021| 狠狠色综合一区二区| 国产欧美日韩一级| 欧美视频专区一二在线观看| 免费观看成人www动漫视频| 久久国产直播| 校园春色国产精品| 亚洲欧美www| 亚洲图片欧美午夜| 在线一区视频| 日韩香蕉视频| 一本久道综合久久精品| 亚洲人成网在线播放| 亚洲福利在线看| 欧美黄色免费网站| 欧美丰满少妇xxxbbb| 欧美大片在线观看一区| 暖暖成人免费视频| 欧美大片免费观看在线观看网站推荐| 狂野欧美激情性xxxx| 久久夜色精品一区| 男人的天堂亚洲在线| 欧美成人午夜激情视频| 欧美h视频在线| 欧美激情一区二区三级高清视频| 欧美不卡高清| 亚洲国产高清在线观看视频| 最新热久久免费视频| 亚洲精品免费在线观看| 一区二区三区高清不卡| 一区二区三区视频在线观看| 一本色道久久综合亚洲精品按摩| 99综合视频| 亚洲欧美日韩国产综合精品二区| 欧美一区成人| 看欧美日韩国产| 欧美日韩高清在线一区| 欧美日韩国产综合在线| 国产精品久久久久999| 国产视频在线观看一区| 伊人影院久久| 在线视频你懂得一区| 性欧美办公室18xxxxhd| 久久综合五月| 亚洲老司机av| 欧美综合国产| 欧美激情麻豆| 国产九九精品视频| 亚洲激情电影中文字幕| 亚洲一级免费视频| 美女精品在线| 夜夜夜久久久| 久久三级福利| 欧美午夜久久| 在线日韩欧美视频| 午夜日韩av| 亚洲国产成人av| 小嫩嫩精品导航| 欧美日韩在线精品| 激情久久久久久| 亚洲欧美另类中文字幕| 嫩草成人www欧美| 91久久综合亚洲鲁鲁五月天| 狠狠色丁香久久综合频道| 亚洲狼人综合| 久久综合九色欧美综合狠狠| 亚洲免费成人| 久久综合电影| 国产日韩欧美在线一区| aa亚洲婷婷| 欧美激情视频一区二区三区不卡| 亚洲主播在线播放| 欧美日本韩国一区二区三区| 一区二区三区自拍|