2013-04-26 1 views
0

부스트 프로그램 옵션을 사용하여 CLI를 구문 분석합니다.Boost Program Options는 알려지지 않은 값 토큰을 자동으로 무시합니다. 왜?

내가 직면 한 문제는 CLI 앞에 '-'또는 '-'표시가없는 토큰이 있으면 라이브러리가 예외를 throw하는 대신 자동으로 무시한다는 것입니다.

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의 빈 목록을 만들고 파서 https://stackoverflow.com/a/3859400/670719
에 공급 할 수있는 예상 된 동작
  • 에 대한 positionals을 금지한다을
  • +0

    예상되는 동작이 나타납니다. 슬프게도 예외를 발생시킨 토큰 (또는 토큰 목록)이 예외에 포함되지 않습니다. 이렇게하면 사용자에게 표시되는 메시지가 매우 모호 해집니다. – anni

    +1

    포지셔닝을 입력하면 수동으로 토큰을 포함하는 오류를 인쇄하고 인쇄 할 수 있습니다. – Riga

    +0

    좋습니다. 그러나 위치 정보가 명시 적으로 언급되지 않으면 기본적으로 라이브러리가 예외를 throw 할 것으로 기대합니다. 'allow_unregistered'가 설정되어있는 경우,이 토큰을 수집해야하지만 그렇지 않다면 라이브러리는 반드시 예외를 던져야합니다. – anni

    관련 문제