具有隐含值的Boost程序选项错误地获取位置选项的值

时间:2014-03-10 17:28:03

标签: c++ boost-program-options

我的应用程序的My Boost程序选项如下。

namespace po = boost::program_options;
desc.add_options()  
    ( "logFile,l" , po::value<std::string>(&logFilename)->implicit_value( "trace.log" ) , "Log file name" )
    ( "deviceType,d" , po::value<std::string>(&deviceName)->required() , "Device type" )
    ( "inputFile" , po::value<std::string>(&inputFilename)->required() , "Input filename" );

po::positional_options_description positionalOptions;
positionalOptions.add( "inputFile" , -1 );

问题是,根据位置,logFile选项可能会错误地获取inputFile选项的值。在示例中:

./application.exe -d Frobnigator -l /path/to/input/file.xml

其中/path/to/input/file.xml是输入文件,而不是日志文件,我收到错误消息the option '--inputFile' is required but missing。首先出现logFile选项时不会发生此类问题,如此

./application.exe -l -d Frobnigator /path/to/input/file.xml

如何在具有隐含值的选项和位置选项之间强制进行这种分离?或者是否有另一种解决这个问题的方法?

1 个答案:

答案 0 :(得分:1)

显然,命令行解析器无法区分这两种情况:

  1. 隐式选项,后跟一个值,该值应该替换预定义的隐式值
  2. 隐式选项,后跟(甚至是必需的)位置参数
  3. 所以,它盲目地决定它将与案例#1一致。您仍然可以通过双短划线标记选项的结尾 - 然后解析器将获得输入文件名:

    ./application.exe -d Frobnigator -l -- /path/to/input/file.xml
    

    我认为这种逻辑很有意义,因为它很简单,否则对于用户来说要记住哪些位置参数是必需的以及哪些不是必需的,这太费力了。