我的应用程序的 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。您仍然可以通过双破折号标记选项结尾 - 然后解析器将获取输入文件名:
./application.exe -d Frobnigator -l -- /path/to/input/file.xml
我认为这个逻辑很有意义,因为它很简单,否则用户会很难记住哪些位置参数是必需的,哪些不是。
关于c++ - 具有隐含值的Boost程序选项错误地获取位置选项的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22307098/