3

Il semble y avoir un problème dans la façon dont boost :: program_options correspond à options_description.boost :: program_options - fait-il une chaîne de caractères exacte pour les options de la ligne de commande?

int main(int argc, char* argv[]) 
{ 
    boost::program_options::options_description desc("CmdLine utility"); 
    desc.add_options() 
     ("hel", "hel message") 
     ("help", "produce help message") 
     ("helps","helps message")  
    ; 
    boost::program_options::variables_map vm; 
    boost::program_options::store(boost::program_options::parse_command_line(argc, argv,desc), vm); 
    boost::program_options::notify(vm); 

    if(vm.count("help")) { 
     std::cout << desc << std::endl; 
    } 
    if(vm.count("helps")) { 
     std::cout << "helps..." << std::endl; 
    } 
    if(vm.count("hel")) { 
     std::cout << "hel..." << std::endl; 
    } 
    return 0; 
} 

Sortie -

C:\code>cmd.exe --helps 
helps... 
C:\code>cmd.exe --help 
helps... 
C:\code>cmd.exe --hel 
helps... 

Les changements de sortie si je change l'ordre dans lequel les options sont ajoutées à l'aide add_options() appel. De même, il semble que program_options ne fasse pas correspondre une chaîne de commande complète, donc même si vous entrez une sous-chaîne de l'option, elle la considérera comme une option valide sans effectuer de comparaison de chaîne complète. S'il s'agit d'une fonctionnalité boost :: program_options, y a-t-il un moyen de forcer la correspondance exacte des chaînes plutôt que de la faire avec la sous-chaîne correspondante? (J'utilise Boost version 1.42)

Répondre

3

Par défaut, program_option a allow_guessing peu de style, donc un match de sous-chaîne est suffisante. Le comportement que vous observez, lorsqu'une option correspond à un préfixe de la ligne de commande, même lorsqu'une autre option correspond parfaitement, est un bogue. C'est corrigé en 1.45.

0

Peut-être que vous avez appelé à tort. Votre exemple est bon. Regardez la sortie que je suis:

[[email protected] example]$ ./a.out --help 
CmdLine utility: 
    --hel     hel message 
    --help    produce help message 
    --helps    helps message 

[[email protected] example]$ ./a.out --hel 
hel... 
[[email protected] example]$ ./a.out --helps 
helps... 
+0

Je l'ai essayé sur ma machine Linux mais la sortie ne correspondait pas à ce que vous avez posté. J'utilise boost 1.42 et g ++ (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)). Quelle version boost et g ++ utilisez-vous? –

+0

@Onkar J'utilise fedora 9, g ++ 4.3.0 et boost 1.34.1. Ils sont périmés, mais je ne pense pas que la fonctionnalité de boost :: program_options change entre-temps. –

Questions connexes