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

Boost.Program_options: Forward parameters after '--' to another program

我正在编写一个 C++ 应用程序 A,它在后台调用另一个应用程序 B。一些命令行选项适用于应用 A,但有些应转发给 B。分隔应该使用双破折号 --.

例如:

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

应该在应用程序 A 中解析 {"-a", "--long_b", "some_file"} 并在被调用时将 {"-c", "--long_d"} 转发给应用程序 B A.

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

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

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

没有对此的内置支持。我推荐的是从整个 argv 数组中创建一个 std::vector,找到“--”,如果找到,将向量切片并将第一部分传递给 program_options(它接受 std::vector也是)和你程序的第二部分。

这是默认行为(如果未记录)并且至少从 Boost 1.33 开始; -- is considered a "terminator" and all command line parameters after it can be accessed as 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);