Boost.Program_options:将' - '之后的参数转发给另一个程序

时间:2015-09-28 11:39:22

标签: c++ boost getopt boost-program-options

我正在编写一个C ++应用程序 A ,它在后台调用另一个应用程序 B 。某些命令行选项适用于应用程序 A ,但有些应该转发到 B 。分离应该使用双短划线--

例如:

./my_executable_A -a --long_b some_file -- -c --long_d

在应用 A 中解析{"-a", "--long_b", "some_file"}并在 A 调用 B 时转发{"-c", "--long_d"}

我认为将boost::program_options用于任务可能有意义,但我没有找到此功能。这可能吗?

注意:用例是libfuse文件系统,其中一些选项将转发到fuse_main()函数。

3 个答案:

答案 0 :(得分:2)

没有内置的支持。我建议只是从整个argv数组创建一个std :: vector,找到“ - ”,如果找到,切片向量并将第一部分传递给program_options(它也接受std :: vector)和第二部分到您的计划。

答案 1 :(得分:2)

这是默认行为(如果没有记录)并且至少已经升级1.33; -- is considered a "terminator"之后的所有命令行参数以及positional options后的所有命令行参数:

bool a = false, b = false;
std::vector<std::string> command;
po::options_description desc("Allowed options");
desc.add_options()
        ("long_a,a", po::bool_switch(&a), "a")
        ("long_b,b", po::bool_switch(&b), "b")
        ("command", po::value(&command));
po::positional_options_description p;
p.add("command", -1);
po::variables_map vm;
po::parsed_options parsed = po::command_line_parser(argc, argv).options(desc).positional(p).run();
po::store(parsed, vm);
po::notify(vm);

Example

答案 2 :(得分:1)

您可能拥有的一个选项是让它们全部作为参数进入,并且在' - '之后将这些参数存储在另一个发送到分叉进程的char **中。请注意,在fork之前,您需要设置输出和输入,以便它们可以相互通信,具体取决于您希望应用程序B执行的操作