我的应用程序的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
如何在具有隐含值的选项和位置选项之间强制进行这种分离?或者是否有另一种解决这个问题的方法?
答案 0 :(得分:1)
显然,命令行解析器无法区分这两种情况:
所以,它盲目地决定它将与案例#1一致。您仍然可以通过双短划线标记选项的结尾 - 然后解析器将获得输入文件名:
./application.exe -d Frobnigator -l -- /path/to/input/file.xml
我认为这种逻辑很有意义,因为它很简单,否则对于用户来说要记住哪些位置参数是必需的以及哪些不是必需的,这太费力了。