2015-09-28 8 views
1

Я пишу приложение C++ A, которое вызывает другую заявку B в фоновом режиме. Некоторые параметры командной строки для приложения A, но некоторые из них должны быть перенаправлены на B. Разделение должно работать с двойной тире --.Boost.Program_options: параметры вперед после '-' в другую программу

Например:

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

должен разобрать {"-a", "--long_b", "some_file"} в применении и вперед {"-c", "--long_d"} к применению B, когда его называют .

Я думал, что имеет смысл использовать boost::program_options для выполнения этой задачи, но я не нашел эту функцию. Это возможно?

Примечание: Прецедент является libfuse файловой системы, где некоторые из вариантов должны быть переданы функции fuse_main().

+0

Было некоторое время назад, что я испортил библиотеку опций программы Boost, но, похоже, я помню, что был флаг или что-то, чтобы попросить библиотеку прекратить синтаксический анализ, когда он ударил '' - '', и оставьте остальные аргументы в 'argc' /' argv'. –

+0

Возможно, вы захотите ознакомиться с этим билетом в буфере отслеживания ошибок Boost: https://svn.boost.org/trac/boost/ticket/6991 - также подумайте, хотите ли вы вообще изменить свой синтаксис командной строки или полностью установлен в камне? –

+0

Если есть еще один короткий синтаксис, я бы хотел переключиться на него. Преимущество этого заключается в том, что оно используется другими файловыми системами libfuse и поэтому известно. Однако они выполняют ручную разборку. – Heinzi

ответ

2

Для этого нет встроенной поддержки. Я бы порекомендовал просто создать std :: vector из всего массива argv, найти «-» и, если его найти, разрезать вектор и передать первую часть program_options (которая принимает std :: vector), а вторая часть к вашей программе.

1

Один из вариантов, который у вас есть, состоит в том, чтобы все они вошли в качестве аргументов и после того, как «-» имеют те аргументы, которые хранятся в другом символе **, который отправляется в разветвленный процесс. Обратите внимание, что перед вилкой вы хотите настроить выходы и входы, чтобы они могли разговаривать друг с другом, в зависимости от того, что вы хотите, чтобы приложение B выполняло

1

Это поведение по умолчанию (если недокументировано) и с момента, по крайней мере, Boost 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.

 Смежные вопросы

  • Нет связанных вопросов^_^