C++ boost程序选项在从命令行读取数据时会更改数据(这是boost中的错误吗?)

C++ boost程序选项在从命令行读取数据时会更改数据(这是boost中的错误吗?),c++,boost,boost-program-options,C++,Boost,Boost Program Options,我在boost::program options中有以下代码: ("output_path,o", po::value< std::string >(&outputPath)->implicit_value(""), "path to where the output should be created.") 当boost选项用数据填充outputPath时,我在变量中得到以下值: C:\My Data\ImagesWithDifferentResolution"

我在boost::program options中有以下代码:

("output_path,o", po::value< std::string >(&outputPath)->implicit_value(""), "path to where the output should be created.")
当boost选项用数据填充outputPath时,我在变量中得到以下值:

 C:\My Data\ImagesWithDifferentResolution"
请注意路径末尾的额外引号

我怎样才能修好它

编辑1 很明显,这是boost中的一个bug。我知道在编译代码时应该转义字符串,但这是boost程序选项的工作方式,也是从命令行提取输入数据的方式

再解释一下:

我的程序名为testPrg.exe,我正在尝试以下方式调用它:

 testprg.exe -o "C:\My Data\ImagesWithDifferentResolution\"
这是正确的,我的用户应该能够做到这一点。无需在命令行上转义\

但是boost程序选项错误地将最后一个\“转换为转义值

显示错误的测试应用程序:

main()
{
    po::options_description desc("Allowed options");
    std::string outputPath;
    desc.add_options()
    ("output_path,o", po::value< std::string >(&outputPath)->implicit_value(""), "path to where the output should be created.")
                ;
    po::variables_map vm;
    po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
    po::notify(vm);
    std::cout<<outputPath <<std::endl;
 }
main()
{
采购订单:选项描述描述(“允许选项”);
std::字符串输出路径;
说明添加选项()
(“输出路径,o”,po::value(&outputPath)->隐式值(“”,“应创建输出的路径”)
;
变量映射虚拟机;
po::store(po::命令行解析器(argc,argv).options(desc).positional(p).run(),vm);
po::通知(vm);

std::cout这不是Boost.Program\u选项中的错误;这是编译器提供的Microsoft C/C++启动代码的预期行为。也就是说,
\“
在传递到
argv
中的
main
时已经转换为

来自Visual Studio 2015参考资料:

前有反斜杠的双引号(
\”
)被解释为文字双引号(


一种可能的解决方法可能是调用
GetCommandLine
获取
lpCommandLine
,并且(尽管这可能与Microsoft启动代码具有相同的行为)或者自己拆分命令行。

您正在转义“使用\,使用另一个\进行转义\将起作用。其他参数不受影响吗?这将很奇怪。您需要:
-o“C:\My Data\ImagesWithDifferentResolution\\”
。无论如何,总是逃避\。
C:\\My Data\\Images
…等是个好主意actually@PiotrJaszkowski:请注意,这是来自命令行的程序选项,我无法逃避!我认为这是boost中的一个bug!@mans:这不是boost中的bug,而是一个功能。这取决于用户是否正确地逃避命令行参数。对于例如,你想传递这样一个论点:
--mom“他说:\“不!”
如果不转义,这是不可能的,你也不能指望boost知道你真正想要做什么。@PiotrJaszkowski感谢你的解释。有没有什么方法可以配置boost不进行转义而只是将数据传递给我?例如,我不想转义路径数据,所以我想阻止它在此选项上执行转义N
main()
{
    po::options_description desc("Allowed options");
    std::string outputPath;
    desc.add_options()
    ("output_path,o", po::value< std::string >(&outputPath)->implicit_value(""), "path to where the output should be created.")
                ;
    po::variables_map vm;
    po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
    po::notify(vm);
    std::cout<<outputPath <<std::endl;
 }
Command-Line Input | argv[1] | argv[2] | argv[3]
-------------------+---------+---------+---------
"ab\"c" "\\" d     | ab"c    | \       | d