Boost.Program_options를 사용하여 strace
과 같은 접두사 프로그램을 작성하고 싶습니다. 접두사는 내 프로그램이 다른 임의의 앞에 놓이는 것을 의미합니다. command [args]
. 따라서 내 프로그램은 정의 된 키워드 인수/플래그를 수락해야합니다. 첫 번째 위치 인수는 내가 접두어로 붙인 명령을 나타냅니다. 이 명령 자체는 내가 모르는 매개 변수 조합과 내 프로그램의 매개 변수와 겹칠 수도 있습니다. 그것에서 끝나야 다음에 오는 따라서 첫 번째 위치 인수 및 아무거나 std::vector<std::string>
:Boost.Program_options로 접두어 명령을 작성하십시오.
./foo --bar 13 command1 # Should run fine
./foo command2 positional # Should run fine
./foo --bar 13 command3 --unknown argument # Should run fine
./foo --unknown command4 # should fail
./foo --bar 13 command5 --bar 42 # Should work but set bar to 13
./foo command6 --bar 42 # Should not set bar at all
./foo --bar 13 -- command7 --bar 42 --unknown argument # Should work
, 첫째가 있습니다 내 사전 정의 된
내가 시도 두 가지 방법의 수해야 정의 :
1) allow_unregistered
사용 :
#include <iostream>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, const char** argv)
{
int bar = 0;
po::options_description desc("Allowed options");
desc.add_options()
("bar", po::value(&bar), "bar");
po::variables_map vm;
po::parsed_options parsed =
po::command_line_parser(argc, argv).options(desc).allow_unregistered().run();
po::store(parsed, vm);
po::notify(vm);
auto command = po::collect_unrecognized(parsed.options, po::include_positional);
std::cout << "bar: " << bar << ", command:";
for (const auto& c : command) std::cout << " " << c;
std::cout << std::endl;
}
을
이 명령 4,5,6
2)이 명령 3,5,6 실패 무제한 발생
std::vector<std::string> command;
desc.add_options()
("bar", po::value(&bar), "bar")
("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);
함께 한 위치 옵션을 실패합니다.
자세한 내용을 자세히 설명하고 어떤 조합을 허용해야하는지, 허용하지 않는지,이 7 가지 예에서는 분명하지 않습니다. – alexeykuzmin0
@ alexeykuzmin0 내 업데이트를 참조하십시오. "접두사는 내 프로그램이 다른 임의의 것 'command [args]'. 따라서 내 프로그램은 정의 된 여러 개의 키워드 인수/플래그를 받아 들여야합니다. 첫 번째 위치 인수는 접두어로 붙이는 명령을 나타냅니다.이 명령 뒤에는 내가하는 매개 변수의 조합이 올 수 있습니다 알지 못하고 내 프로그램의 매개 변수와 겹칠 수도 있습니다. 따라서이 첫 번째 위치 인수와 그 이후에 오는 모든 것은'std :: vector' "에 있어야합니다. 예제는 특정 코너 케이스를 나타냅니다. –
Zulan
인수에 공백이 포함될 수 있습니까? 그런 경우에 논쟁이 ""에 있습니까? – alexeykuzmin0