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

标签 c++ boost-program-options

我的应用程序的 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 是输入文件,而不是日志文件,我收到错误消息选项“--inputFile”是必需的但缺少。当logFile选项首先出现时不会出现这样的问题,就像这样

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

如何强制将具有隐式值的选项与位置选项分开?或者有其他解决方案吗?

最佳答案

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

  1. 隐式选项,后跟一个值,该值应该替换预定义的隐式值
  2. 隐式选项,后跟(甚至是必需的)位置参数

因此,它盲目地决定采用案例#1。您仍然可以通过双破折号标记选项结尾 - 然后解析器将获取输入文件名:

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

我认为这个逻辑很有意义,因为它很简单,否则用户会很难记住哪些位置参数是必需的,哪些不是。

关于c++ - 具有隐含值的Boost程序选项错误地获取位置选项的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22307098/

相关文章:

c++ - 我如何在 python 中取消引用? (使用openCV进行图像处理)

c++ - 为什么 `ccos` 、 `csqrt` 、 `cpow` 不被识别?

c++ - 在 Boost program_options 中解析配置文件的未注册选项?

c++ - boost::program_options :迭代并打印所有选项

php - 更改 Boost Program Options 中的注释字符?

c++ - 应用程序编译过程中出现奇怪的单词

c++ - 在继承的情况下,每个类的静态数据成员是否唯一?

c++ - 分支预测和分支目标预测优化

c++ - 从有更多参数的配置文件中读取一个参数,使用 boost program_options

boost - boost::program_options 中的default_value 和implicit_value 有什么区别?