2013-04-26 48 views
0

我正在使用Boost程序選項來分析CLI。Boost Program Options默默忽略未知值標記。爲什麼?

我面對的問題是,如果在CLI中沒有' - '或' - '的CLI中有任何標記,庫默默忽略它而不是拋出異常。

下面是示例程序:

try 
{ 
    options_description od; 
    od.add_options() 
     ("dummy,d", value<int>()->required(), "does nothing..."); 

    variables_map vm; 
    wparsed_options po = parse_command_line(argc, argv, od); 
    store(po, vm); 
    notify(vm); 

    cout << vm["dummy"].as<int>() << endl; 
} 
catch (const error& e) 
{ 
    cout << e.what() << endl; 
} 

下面是一些樣品運行:

Debug>test 
the option '--dummy' is required but missing 

Debug>test -d 
the required argument for option '--dummy' is missing 

Debug>test -d 1 
1 

Debug>test -d 1 asas 
1 

現在,前三運行的預期。但是,爲什麼第三次運行不會拋出任何異常? 'asas'不匹配任何選項,-d不接受向量。我究竟做錯了什麼?或者圖書館是這樣設計的?

回答

1
  1. 前沒有破折號令牌被稱爲位置參數
  2. 你應該明確地禁止positionals的預期行爲
  3. 做到這一點使positionals的空列表,並將其輸送到分析器 https://stackoverflow.com/a/3859400/670719
+0

得到預期的行爲。可悲的是,拋出的異常不包含導致異常的令牌(或令牌列表)。這使得向用戶顯示的消息非常模糊。 – anni 2013-04-29 06:33:16

+1

如果您在輸入中獲得定位,則可以允許一個(如果您喜歡多個標記)位置,然後手動打印包含不正確標記的錯誤。 – Riga 2013-04-29 15:12:06

+0

好主意。但是,如果定位沒有明確提及,人們會預期該庫默認會引發異常。如果設置了'allow_unregistered',它應該收集這些令牌,但如果它不是,那麼庫肯定會拋出異常。 – anni 2013-05-02 07:32:02