[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; }

    좋은 웹페이지 즐겨찾기