2012-04-17 1 views
2

я следующую программу:Почему boost :: program_options принимает нарезанные слова?

#include <boost/program_options.hpp> 

bool check_options(int argc, char** argv) 
{ 
    using namespace boost::program_options; 
    variables_map vm; 

    // Command line options 
    std::string cfg_file_name; 
    options_description cmd_line("Allowed options"); 
    cmd_line.add_options() 
     ("help", "produce this help message") 
     ; 

    store(parse_command_line(argc, argv, cmd_line), vm); 
    notify(vm);  
    if(vm.count("help")) 
    { 
     std::cout << cmd_line << std::endl; 
     return false; 
    } 
    return true; 
} 

int main(int argc, char** argv) 
{ 
    if(!check_options(argc, argv)) 
     return 1; 
    return 0; 
} 

Когда я запускаю его с ./myprg --help я получаю результат я ожидаю:

Allowed options: 
    --help    produce this help message 

Однако я получаю тот же результат, даже если я бегу: ./myprg --h или ./myprg --he или ./myprg --hel. Должны ли эти последние варианты вызывать ошибку?

+0

Похоже, что это «по умолчанию стиль". См. Это сообщение на сайте Boost http://lists.boost.org/boost-users/2007/02/25861.php –

+0

yup, вот и все! Если вы напишете ответ, разместите эту ссылку, я соглашусь с ней. – Emiliano

+0

работает так, как было разработано? – PlasmaHH

ответ

4

Похоже, что принятие частичных совпадений - default_style для boost::option.

Согласно ответу на сайте Boost, http://lists.boost.org/boost-users/2007/02/25861.php

это значение по умолчанию может быть изменен, чтобы потребовать полный матч, путем передачи дополнительного параметра в parse_command_line.

EDIT на OP: На самом деле вместо parse_command_line я должен был использовать более общий command_line_parser (что позволяет changings стиль), таким образом заменяя store(... линию с этим одним:

store(command_line_parser(argc, argv).options(cmd_line).style(command_line_style::default_style & ~command_line_style::allow_guessing).run(), vm);