Contents
1. 참고링크 [Bottom] [Top]
Boost Program_options Library http://www.boost.org/doc/html/program_options.html
2. Component 구성 [Bottom] [Top]
2.1. Options Description Component [Bottom] [Top]
option_description - 옵션 이름, 설명, value 객체(value_semantic) 를 갖는 클래스, 1개의 옵션 정보만 저장
- value_semantic - 특정 타입의 데이터를 갖는 클래스
- options_description - option_description 인스턴스 컨테이너
2.2. Parsers Component [Bottom] [Top]
- parse_command_line - 명령행 처리
- basic_command_line_parser - 명령행 처리 (확장)
- parse_config_file - 설정 파일 처리
- parse_environment - 환경 설정 처리
2.3. Storage Component [Bottom] [Top]
- variables_map - 옵션 값을 저장하는 클래스
3. 명령행 옵션 처리 과정 [Bottom] [Top]
1 // File: Boost/ExPg_Opts_Cmdline.cpp 2 3 // ExPg_Opts_Cmdline.cpp : boost::program_options::parse_command_line 예제 코드 4 // 5 6 #include <tchar.h> 7 #include <iostream> 8 #include <string> 9 #include <vector> 10 #include <boost/program_options.hpp> 11 12 13 //------------------------------------------------------------------------------ 14 // 상수 정의 15 #define _HELP _T( "help" ) 16 #define _OPTION _T( "option" ) 17 #define _VALUE _T( "value" ) 18 #define _PATH _T( "path" ) 19 20 21 //------------------------------------------------------------------------------ 22 // 네임스페이스 재정의 23 namespace pg_opts = boost::program_options; 24 25 26 //------------------------------------------------------------------------------ 27 // 함수 원형 선언 28 int Test( int nArgc, _TCHAR * pszArgv[] ); 29 30 31 //------------------------------------------------------------------------------ 32 // main() 함수 구현 33 int main(int argc, _TCHAR* argv[]) 34 { 35 Test( argc, argv ); 36 37 return 0; 38 } 39 40 41 //------------------------------------------------------------------------------ 42 // 함수 구현 43 int Test( int nArgc, _TCHAR * pszArgv[] ) 44 { 45 int nOpt; 46 47 // STEP 1: 옵션, 설명 정의 ------------------------------------------------- 48 pg_opts::options_description desc( "Allowed options" ); 49 desc.add_options() 50 ( _HELP ",h", "Show help" ) 51 ( _OPTION, pg_opts::value<int>(), "Set Option" ) 52 ( _VALUE, pg_opts::value<int>( &nOpt )->default_value( 10 ), 53 "Set Value (Default)" ) 54 ( _PATH ",p", pg_opts::value< std::string >(), "Set Path" ) 55 ; 56 57 // 옵션이 없을 경우 58 if( 2 > nArgc ) 59 { 60 std::cout << desc << "\n"; 61 return 1; 62 } 63 64 // STEP 2: 명령행 옵션 분석 ------------------------------------------------ 65 pg_opts::variables_map vm; 66 67 try 68 { 69 pg_opts::store( pg_opts::parse_command_line( nArgc, pszArgv, desc ), vm ); 70 } 71 catch( pg_opts::unknown_option & e ) 72 { 73 // 예외 1: 없는 옵션을 사용한 경우 74 std::cout << e.what() << std::endl; 75 return 10; 76 } 77 catch( pg_opts::invalid_option_value & e ) 78 { 79 // 예외 2: 옵션 값의 오류가 발생한 경우 80 std::cout << e.what() << std::endl; 81 return 11; 82 } 83 catch( pg_opts::invalid_command_line_syntax & e ) 84 { 85 // 예외 3: 옵션 값이 없을 경우 86 std::cout << e.what() << std::endl; 87 return 12; 88 } 89 catch( std::exception & e ) 90 { 91 // 예외 4: 이외의 예외 발생 92 std::cout << e.what() << std::endl; 93 return 20; 94 } 95 96 pg_opts::notify( vm ); 97 98 // STEP 3: 옵션 처리 ------------------------------------------------------- 99 if( vm.count( _HELP ) ) 100 { 101 std::cout << desc << "\n"; 102 return 1; 103 } 104 105 if( vm.count( _OPTION ) ) 106 { 107 std::cout << _OPTION "\t: " << vm[ _OPTION ].as< int >() 108 << std::endl; 109 } 110 111 if( vm.count( _VALUE ) ) 112 { 113 std::cout << _VALUE "\t: " << vm[ _VALUE ].as< int >() 114 << std::endl; 115 } 116 117 if( vm.count( _PATH ) ) 118 { 119 std::cout << _PATH "\t: " << vm[ _PATH ].as< std::string >() 120 << std::endl; 121 } 122 123 return 0; 124 }
- 실행 예1
D:\ExPg_Opts_Cmdline.exe --help
- 실행 결과1
Allowed options: -h [ --help ] Show help --option arg Set Option --value arg (=10) Set Value (Default) -p [ --path ] arg Set Path
- 실행 예2
D:\ExPg_Opts_Cmdline.exe --path="C:\WINDOWS" --option 15 # 긴 옵션 사용('--path') D:\ExPg_Opts_Cmdline.exe -p "C:\WINDOWS" --option 15 # 짧은 옵션 사용('-p') - 실행 결과2
option : 15 value : 10 path : C:\WINDOWS
4. 설정 파일 처리 과정 [Bottom] [Top]
1 // File: Boost/ExPg_Opts_Cfgfile.cpp 2 3 // ExPg_Opts_Cfgfile.cpp : boost::program_options::parse_config_file 예제 코드 4 // 5 6 #include <tchar.h> 7 #include <iostream> 8 #include <fstream> 9 #include <string> 10 #include <vector> 11 #include <boost/program_options.hpp> 12 13 14 //------------------------------------------------------------------------------ 15 // 상수 정의 16 #define _FILENAME _T( "pg_opts.cfg") 17 18 #define _DATA_OPTION _T( "Data.option" ) 19 #define _DATA_VALUE _T( "Data.value" ) 20 #define _FILE_PATH _T( "File.path" ) 21 22 23 //------------------------------------------------------------------------------ 24 // 네임스페이스 재정의 25 namespace pg_opts = boost::program_options; 26 27 28 //------------------------------------------------------------------------------ 29 // 함수 원형 선언 30 int Test( _TCHAR * pszFile ); 31 32 33 //------------------------------------------------------------------------------ 34 // main() 함수 구현 35 int main(int argc, _TCHAR* argv[]) 36 { 37 Test( _FILENAME ); 38 39 return 0; 40 } 41 42 43 //------------------------------------------------------------------------------ 44 // 함수 구현 45 int Test( _TCHAR * pszFile ) 46 { 47 int nOpt; 48 49 // STEP 1: 옵션, 설명 정의 ------------------------------------------------- 50 pg_opts::options_description desc; 51 desc.add_options() 52 ( _DATA_OPTION, pg_opts::value<int>() ) 53 ( _DATA_VALUE, pg_opts::value<int>( &nOpt )->default_value( 10 ) ) 54 ( _FILE_PATH, pg_opts::value< std::string >() ) 55 ; 56 57 // STEP 2: 명령행 옵션 분석 ------------------------------------------------ 58 pg_opts::variables_map vm; 59 60 try 61 { 62 std::ifstream ifs( pszFile ); 63 pg_opts::store( pg_opts::parse_config_file( ifs, desc ), vm ); 64 } 65 catch( pg_opts::unknown_option & e ) 66 { 67 // 예외 1: 없는 옵션을 사용한 경우 68 std::cout << e.what() << std::endl; 69 return 10; 70 } 71 catch( pg_opts::invalid_option_value & e ) 72 { 73 // 예외 2: 옵션 값의 오류가 발생한 경우 74 std::cout << e.what() << std::endl; 75 return 11; 76 } 77 catch( pg_opts::invalid_command_line_syntax & e ) 78 { 79 // 예외 3: 옵션 값이 없을 경우 80 std::cout << e.what() << std::endl; 81 return 12; 82 } 83 catch( std::exception & e ) 84 { 85 // 예외 4: 이외의 예외 발생 86 std::cout << e.what() << std::endl; 87 return 20; 88 } 89 90 pg_opts::notify( vm ); 91 92 // STEP 3: 옵션 처리 ------------------------------------------------------- 93 if( vm.count( _DATA_OPTION ) ) 94 { 95 std::cout << _DATA_OPTION "\t: " << vm[ _DATA_OPTION ].as< int >() 96 << std::endl; 97 } 98 99 if( vm.count( _DATA_VALUE ) ) 100 { 101 std::cout << _DATA_VALUE "\t: " << vm[ _DATA_VALUE ].as< int >() 102 << std::endl; 103 } 104 105 if( vm.count( _FILE_PATH ) ) 106 { 107 std::cout << _FILE_PATH "\t: " << vm[ _FILE_PATH ].as< std::string >() 108 << std::endl; 109 } 110 111 return 0; 112 }
- 설정 파일 내용
# 파일명: pg_opts.cfg [Data] option = 25 value = 30 [File] path = "C:\Program Files"
- 실행 결과
Data.option : 25 Data.value : 30 File.path : C:\Program Files
