歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++實現的命令行參數管理

在用C++編寫可運行程序時,經常需要輸入除了可運行文件之外的其它的命令行參數,可以用傳統的getopt函數來分析,本文基於面向對象,分析一種管理命令行參數方法 -- 來源於webrtc項目,在閱讀過程中,大家分享一下。

一,傳統命令行分析

包含頭文件:

  1. #include<unistd.h> 
  2.   int getopt(int argc,char * const argv[ ],const char * optstring); 
  3.   extern char *optarg; 
  4.   extern int optind, opterr, optopt; 

二,命令行參數管理

假設命令行的輸入格式的規則如下:

  • --flag          布爾類型。
  • --noflag      布爾類型。
  • --flag=value  等號周邊沒有空格。

2.1 參數的值封裝---FlagValue

這個類對參數的值進行封裝,如--prefix=/usr,作為一個命令行參數時,prefix為鍵,/usr為值。在參數中,在此定義值的類型為布爾、整型、浮點、字符串中的一種。

由於一個值在只能取四種的一種,所以此處用聯合類型表示FlagValue。

  1. union FlagValue { 
  2.   static FlagValue New_BOOL(int b) { 
  3.     FlagValue v; 
  4.     v.b = (b != 0); 
  5.     return v; 
  6.   } 
  7.  
  8.   static FlagValue New_INT(int i) { 
  9.     FlagValue v; 
  10.     v.i = i; 
  11.     return v; 
  12.   } 
  13.  
  14.   static FlagValue New_FLOAT(float f) { 
  15.     FlagValue v; 
  16.     v.f = f; 
  17.     return v; 
  18.   } 
  19.  
  20.   static FlagValue New_STRING(const char* s) { 
  21.     FlagValue v; 
  22.     v.s = s; 
  23.     return v; 
  24.   } 
  25.  
  26.   bool b; 
  27.   int i; 
  28.   double f; 
  29.   const char* s; 
  30. }; 

這個聯合類型對命令行中鍵值對中的值進行封裝,可以表示四種類型。

2.2 命令行中鍵值的表示 -- Flag

這個類是表示一對鍵值的抽象,包含下列元素:

  • 鍵值對。包括name和variable_表示鍵和值。如--prefix=/usr中,name的值為prefix,variable_為/usr的一個表示。
  • 鏈表維護域。Flag *next_用於指向下一個命令行參數。
  • comment_表示該參數的解釋。
  • file表示和鍵值相關的外部文件。
  • default_表示默認情況下,就是用戶沒有輸入該參數的情況下默認的值。
  • 定義友元類FlagList,因為FlagList需要訪問Flag的next_域。
  1. class Flag { 
  2.  public
  3.   enum Type { BOOLINTFLOAT, STRING }; 
  4.  
  5.   // Internal use only.  
  6.   Flag(const char* file, const char* name, const char* comment, 
  7.        Type type, void* variable, FlagValue default_); 
  8.  
  9.   // General flag information  
  10.   const char* file() const  { return file_; } 
  11.   const char* name() const  { return name_; } 
  12.   const char* comment() const  { return comment_; } 
  13.  
  14.   // Flag type  
  15.   Type type() const  { return type_; } 
  16.  
  17.   // Flag variables  
  18.   bool* bool_variable() const { 
  19.     assert(type_ == BOOL); 
  20.     return &variable_->b; 
  21.   } 
  22.    
  23.   int* int_variable() const { 
  24.     assert(type_ == INT); 
  25.     return &variable_->i; 
  26.   } 
  27.    
  28.   double* float_variable() const { 
  29.     assert(type_ == FLOAT); 
  30.     return &variable_->f; 
  31.   } 
  32.    
  33.   const char** string_variable() const { 
  34.     assert(type_ == STRING); 
  35.     return &variable_->s; 
  36.   } 
  37.  
  38.   // Default values  
  39.   bool bool_default() const { 
  40.     assert(type_ == BOOL); 
  41.     return default_.b; 
  42.   } 
  43.    
  44.   int int_default() const { 
  45.     assert(type_ == INT); 
  46.     return default_.i; 
  47.   } 
  48.    
  49.   double float_default() const { 
  50.     assert(type_ == FLOAT); 
  51.     return default_.f; 
  52.   } 
  53.    
  54.   const char* string_default() const { 
  55.     assert(type_ == STRING); 
  56.     return default_.s; 
  57.   } 
  58.  
  59.   // Resets a flag to its default value  
  60.   void SetToDefault(); 
  61.  
  62.   // Iteration support  
  63.   Flag* next() const  { return next_; } 
  64.  
  65.   // Prints flag information. The current flag value is only printed  
  66.   // if print_current_value is set.  
  67.   void Print(bool print_current_value); 
  68.  
  69.  private
  70.   const char* file_; 
  71.   const char* name_; 
  72.   const char* comment_; 
  73.  
  74.   Type type_; 
  75.   FlagValue* variable_; 
  76.   FlagValue default_; 
  77.  
  78.   Flag* next_; 
  79.  
  80.   friend class FlagList;  // accesses next_  
  81. }; 
Copyright © Linux教程網 All Rights Reserved