[C++Boost] 프로그램 매개변수 항목 분석 라이브러리 Programoptions 사용 설명서
16482 단어 option
프로그램 매개 변수 항목(program options)은 일련의name=value 쌍, 프로그램options는 프로그램 개발자가 명령줄 (command line)과 프로필 (config file) 을 통해 이 매개 변수 항목을 가져올 수 있도록 합니다.
왜 이런 창고가 필요합니까?왜 당신이 직접 코드를 써서 명령행 파라미터를 분해하는 것보다 좋습니까?
사용 설명서
빠른 시작
상해를 사용하다
매개 변수
이 절에서 우리는 가장 간단한 예로부터 프로그램을 배운다options 라이브러리의 일반적인 사용법입니다.다음 예는 코드 단편일 뿐입니다. 전체 예는 'BOOST ROOT/libs/program options/example' 디렉터리에 있습니다.모든 예는 다음과 같은 이름 공간에 있다고 가정한다.
namespace po = boost::program_options;
빠른 시작
첫 번째 예는 가능한 한 간단하다. 단지 두 개의 매개 변수 항목만 포함한다.코드는 다음과 같습니다(전체 코드는 "example/first.cpp").
// Declare the supported options.
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("compression", po::value(), "set compression level")
;
po::variables_map vm;
po::store(po::parse_command_line(ac, av, desc), vm);
po::notify(vm);
if (vm.count("help")) {
cout << desc << "
";
return 1;
}
if (vm.count("compression")) {
cout << "Compression level was set to "
<< vm["compression"].as() << ".
";
} else {
cout << "Compression level was not set.
";
}
우선 클래스options_description로 허용되는 모든 매개 변수 항목, 클래스의add 를 설명합니다options 방법은 Operator () 를 정의한 프록시 대상을 되돌려주고 Operator () 를 호출하여 실제 매개 변수 항목을 설명합니다. 함수 매개 변수는 매개 변수 항목의 이름, 관련 값 정보, 매개 변수 항목의 설명입니다.이 예에서 첫 번째 매개 변수 항목에는 값이 없고, 두 번째 매개 변수 항목에는 int 형식의 값이 있습니다.
그 다음에 클래스variables 를 정의합니다맵 대상입니다.모든 종류의 값을 저장할 수 있는 매개 변수 항목의 값을 저장합니다.이어서 store,parse 호출command_line과 notify 함수로 명령줄 파라미터를 분석하여 vm에 저장합니다.
현재 std::map을 사용하듯variablesmap 클래스, 그러나 저장된 값은at 방법을 통해 찾을 수 있어야 합니다.만약 as 방법으로 지정한 형식이 실제 형식과 일치하지 않으면 이상을 던집니다)
이제 코드를 컴파일해 볼 수 있습니다. 어떻게 컴파일하는지 예는 다음과 같습니다.
$bin/gcc/debug/first
Compression level was not set.
$bin/gcc/debug/first --help
Allowed options:
--help : produce help message
--compression arg : set compression level
$bin/gcc/debug/first --compression 10
Compression level was set to 10.
상해를 사용하다
매개 변수 항목의 값은 int 외에 다른 종류도 있고 다른 속성도 있습니다. 다음에 토론하겠습니다.전체 예는 example/options description.cpp 에 있습니다.
만약 우리가 컴파일러 프로그램을 쓴다면.그것은 여러 경로, 여러 입력 파일 등 매개 변수를 포함하는 최적화 단계가 있다.설명 매개변수 항목은 다음과 같습니다.
int opt;
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("optimization", po::value(&opt)->default_value(10),
"optimization level")
("include-path,I", po::value< vector >(),
"include path")
("input-file", po::value< vector >(), "input file")
;
The "- help"항목은 전례와 같이 항목에 이 파라미터 항목이 있는 것은 좋은 주의입니다.
The "optimization"항목은 두 가지 새로운 특성을 나타낸다.우선, 우리는 변수 (&opt) 주소를 전달합니다. 이 변수는 얻은 파라미터 항목의 값을 저장하는 데 사용됩니다.그리고 이 매개 변수 항목의 사용자가 값을 설정하지 않았을 때 부족한 값을 지정합니다.
The "include-path"항목은 options 를 설명합니다.description 클래스 인터페이스는 명령줄의 예에서 유래한 것입니다.사용자는 짧은 파라미터 항목의 이름을 즐겨 사용하는데, "include-path, I"이름은 짧은 파라미터 항목의 이름을 "I"라고 지적한다.따라서 "--include-path"와 "-I"를 모두 사용할 수 있습니다.
The input-file 매개 변수 항목은 처리 파일 목록을 지정합니다.다음과 같이 쓰면 문제가 없습니다.
compiler --input-file=a.cpp
그러나 보통 이렇게 쓴다.
compiler a.cpp
여기에 이런 용법을 설명해야 한다.
상례와 같이 매개 변수 이름이 없는 명령행 옵션은 이 라이브러리에서 '위치 매개 변수 항목' 이라고 불리며 처리할 수 있습니다.라이브러리는'a.cpp'가'--input-file=a.cpp'와 같다고 설명할 수 있다.필요한 추가 코드는 다음과 같습니다.
po::positional_options_description p;
p.add("input-file", -1);
po::variables_map vm;
po::store(po::command_line_parser(ac, av).
options(desc).positional(p).run(), vm);
po::notify(vm);
앞의 두 줄은 모든 '위치 매개 변수 항목' 을 'input-file' 항목으로 번역해야 한다고 지적했다.commandline_parser 클래스 해석 명령줄 parse_command_line 함수 대신 명령줄을 해석합니다.parse_command_line 함수는 간단한 상황을 처리하기 위해commandline_parser류의 포장이지만, 현재 추가 정보를 전달하려면 적용되지 않습니다.
현재 모든 매개 변수 항목이 설명되고 해석됩니다.나머지 컴파일 논리는 당분간 구현되지 않으며 매개변수 항목만 인쇄합니다.
if (vm.count("include-path"))
{
cout << "Include paths are: "
<< vm["include-path"].as< vector >() << "
";
}
if (vm.count("input-file"))
{
cout << "Input files are: "
<< vm["input-file"].as< vector >() << "
";
}
cout << "Optimization level is " << opt << "
";
컴파일하는 방법은 다음과 같습니다.
$bin/gcc/debug/options_description --help
Usage: options_description [options]
Allowed options:
--help : produce help message
--optimization arg : optimization level
-I [ --include-path ] arg : include path
--input-file arg : input file
$bin/gcc/debug/options_description
Optimization level is 10
$bin/gcc/debug/options_description --optimization 4 -I foo a.cpp
Include paths are: foo
Input files are: a.cpp
Optimization level is 4
'도움말 정보' 에서 '- input-file' 항목의 이름을 지정해야 하기 때문에 사용자를 헷갈리게 할 작은 문제가 있습니다.뒤의 예에서 이 정보를 어떻게 숨기는지 볼 수 있다.
매개 변수
사용자가 명령줄에서 컴파일러에 모든 파라미터를 지정하도록 요구하는 것은 현실적이지 않다.만약 사용자가 새 라이브러리를 설치하고 추가 명령행 파라미터를 전달하려면 어떻게 해야 합니까?한 번에 여러 번 실행할 때 사용하려면 어떻게 해야 하나요?명령줄 파라미터를 함께 구성하는 프로필을 만들 수 있습니다.
물론 해석할 때 명령행 매개 변수와 프로필 두 방면의 값을 결합시켜야 한다.예를 들어 명령줄에서 지정한 '최적화 단계' 값은 프로필의 값을 덮어씁니다.다른 한편, '경로 포함' 은 명령줄과 프로필의 두 가지 값을 포함해야 한다.
다음은 코드를 보겠습니다.전체 코드는 examples/multiple sources.cpp에 있습니다.매개변수 항목 정의에는 두 가지 세부 사항이 있습니다.우선options 정의description 클래스의 몇 가지 실례일반적인 상황에서 모든 매개 변수 항목의 속성이 유사하지 않기 때문이다.예를 들어 위의 'input-file' 은 자동 도움말 정보에 나타나지 않아야 합니다.하나의 항목은 설정 파일에서만 의미가 있습니다.그 다음으로 정보의 조직적인 출력을 돕는 것은 파라미터 항목의 긴 목록이 아니라 좋은 생각이다.다음은 매개변수 항목 세트에 대해 설명합니다.
// Declare a group of options that will be
// allowed only on command line
po::options_description generic("Generic options");
generic.add_options()
("version,v", "print version string")
("help", "produce help message")
;
// Declare a group of options that will be
// allowed both on command line and in
// config file
po::options_description config("Configuration");
config.add_options()
("optimization", po::value(&opt)->default_value(10),
"optimization level")
("include-path,I",
po::value< vector >()->composing(),
"include path")
;
// Hidden options, will be allowed both on command line and
// in config file, but will not be shown to the user.
po::options_description hidden("Hidden options");
hidden.add_options()
("input-file", po::value< vector >(), "input file")
;
"include-path"항목 성명에서composing 방법을 호출하는 것을 주의하십시오. 이것은 서로 다른 출처의 값이 합쳐져야 한다는 것을 설명합니다. 아래에서 곧 볼 수 있습니다.
options_description 클래스에 대한dd 메서드는 매개변수 항목을 추가로 조합하는 데 사용할 수 있습니다.
po::options_description cmdline_options;
cmdline_options.add(generic).add(config).add(hidden);
po::options_description config_file_options;
config_file_options.add(config).add(hidden);
po::options_description visible("Allowed options");
visible.add(generic).add(config);
Parse를 추가로 호출해야 하는 것 이외에config_파일과 store 함수 이외에 매개 변수 값의 해석과 저장은 보통과 같다.그러나 명령줄과 설정 파일의 같은 매개 변수가 지정되면 어떻게 처리합니까?일반적으로 첫 번째로 저장된 값을 선택합니다.이것은 "--optimization"항목의 값이 어떻게 발생하는지 설명한다.'조합(composing)'항목에 대해'include-file'과 같이 값이 합쳐집니다.
컴파일하는 방법은 다음과 같습니다.
$bin/gcc/debug/multiple_sources
Include paths are: /opt
Optimization level is 1
$bin/gcc/debug/multiple_sources --help
Allows options:
Generic options:
-v [ --version ] : print version string
--help : produce help message
Configuration:
--optimization n : optimization level
-I [ --include-path ] path : include path
$bin/gcc/debug/multiple_sources --optimization=4 -I foo a.cpp b.cpp
Include paths are: foo /opt
Input files are: a.cpp b.cpp
Optimization level is 4
부록.
이해를 강화하기 위해서, 여기에 위에서 언급한 완전한 원본 코드를 열거하였다.
파일 example/first.cpp
#include
namespace po = boost::program_options;
#include
#include
using namespace std;
int main(int ac, char* av[])
{
try {
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("compression", po::value(), "set compression level")
;
po::variables_map vm;
po::store(po::parse_command_line(ac, av, desc), vm);
po::notify(vm);
if (vm.count("help")) {
cout << desc << "
";
return 1;
}
if (vm.count("compression")) {
cout << "Compression level was set to "
<< vm["compression"].as() << ".
";
} else {
cout << "Compression level was not set.
";
}
}
catch(exception& e) {
cerr << "error: " << e.what() << "
";
return 1;
}
catch(...) {
cerr << "Exception of unknown type!
";
}
return 0;
}
파일 example/optionsdescription.cpp
#include
using namespace boost;
namespace po = boost::program_options;
#include
#include
#include
using namespace std;
// A helper function to simplify the main part.
template
ostream& operator<<(ostream& os, const vector& v)
{
copy(v.begin(), v.end(), ostream_iterator(cout, " "));
return os;
}
int main(int ac, char* av[])
{
try {
int opt;
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("optimization", po::value(&opt)->default_value(10),
"optimization level")
("include-path,I", po::value< vector >(),
"include path")
("input-file", po::value< vector >(), "input file")
;
po::positional_options_description p;
p.add("input-file", -1);
po::variables_map vm;
po::store(po::command_line_parser(ac, av).
options(desc).positional(p).run(), vm);
po::notify(vm);
if (vm.count("help")) {
cout << "Usage: options_description [options]
";
cout << desc;
return 0;
}
if (vm.count("include-path"))
{
cout << "Include paths are: "
<< vm["include-path"].as< vector >() << "
";
}
if (vm.count("input-file"))
{
cout << "Input files are: "
<< vm["input-file"].as< vector >() << "
";
}
cout << "Optimization level is " << opt << "
";
}
catch(exception& e)
{
cout << e.what() << "
";
return 1;
}
return 0;
}
파일 examples/multiplesources.cpp
#include
namespace po = boost::program_options;
#include
#include
#include
using namespace std;
// A helper function to simplify the main part.
template
ostream& operator<<(ostream& os, const vector& v)
{
copy(v.begin(), v.end(), ostream_iterator(cout, " "));
return os;
}
int main(int ac, char* av[])
{
try {
int opt;
// Declare a group of options that will be
// allowed only on command line
po::options_description generic("Generic options");
generic.add_options()
("version,v", "print version string")
("help", "produce help message")
;
// Declare a group of options that will be
// allowed both on command line and in
// config file
po::options_description config("Configuration");
config.add_options()
("optimization", po::value(&opt)->default_value(10),
"optimization level")
("include-path,I",
po::value< vector >()->composing(),
"include path")
;
// Hidden options, will be allowed both on command line and
// in config file, but will not be shown to the user.
po::options_description hidden("Hidden options");
hidden.add_options()
("input-file", po::value< vector >(), "input file")
;
po::options_description cmdline_options;
cmdline_options.add(generic).add(config).add(hidden);
po::options_description config_file_options;
config_file_options.add(config).add(hidden);
po::options_description visible("Allowed options");
visible.add(generic).add(config);
po::positional_options_description p;
p.add("input-file", -1);
po::variables_map vm;
store(po::command_line_parser(ac, av).
options(cmdline_options).positional(p).run(), vm);
ifstream ifs("multiple_sources.cfg");
store(parse_config_file(ifs, config_file_options), vm);
notify(vm);
if (vm.count("help")) {
cout << visible << "
";
return 0;
}
if (vm.count("version")) {
cout << "Multiple sources example, version 1.0
";
return 0;
}
if (vm.count("include-path"))
{
cout << "Include paths are: "
<< vm["include-path"].as< vector >() << "
";
}
if (vm.count("input-file"))
{
cout << "Input files are: "
<< vm["input-file"].as< vector >() << "
";
}
cout << "Optimization level is " << opt << "
";
}
catch(exception& e)
{
cout << e.what() << "
";
return 1;
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
map이란 무엇인가map은 어떤 함수를 받아서 순회할 수 있는 것에 그 함수를 적용하여 새로운 순회 가능한 것을 돌려준다. 함수의 인자를 한 번에 다 받는 게 아니라, 여러 인자들로 나누어 받는 기법인 currying이 적용된 함수와...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.