加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

C++达成的命令行参数管理

发布时间:2021-11-22 10:47:31 所属栏目:PHP教程 来源:互联网
导读:在用C++编写可运行程序时,经常需要输入除了可运行文件之外的其它的命令行参数,可以用传统的getopt函数来分析,本文基于面向对象,分析一种管理命令行参数方法 -- 来源于webrtc项目,在阅读过程中,大家分享一下。 一,传统命令行分析 包含头文件: #include
在用C++编写可运行程序时,经常需要输入除了可运行文件之外的其它的命令行参数,可以用传统的getopt函数来分析,本文基于面向对象,分析一种管理命令行参数方法 -- 来源于webrtc项目,在阅读过程中,大家分享一下。
 
一,传统命令行分析
 
包含头文件:
 
#include<unistd.h>
  int getopt(int argc,char * const argv[ ],const char * optstring);
  extern char *optarg;
  extern int optind, opterr, optopt;
二,命令行参数管理
 
假设命令行的输入格式的规则如下:
 
--flag          布尔类型。
--noflag      布尔类型。
--flag=value  等号周边没有空格。
2.1 参数的值封装---FlagValue
 
这个类对参数的值进行封装,如--prefix=/usr,作为一个命令行参数时,prefix为键,/usr为值。在参数中,在此定义值的类型为布尔、整型、浮点、字符串中的一种。
 
由于一个值在只能取四种的一种,所以此处用联合类型表示FlagValue。
 
union FlagValue {
  static FlagValue New_BOOL(int b) {
    FlagValue v;
    v.b = (b != 0);
    return v;
  }
 
  static FlagValue New_INT(int i) {
    FlagValue v;
    v.i = i;
    return v;
  }
 
  static FlagValue New_FLOAT(float f) {
    FlagValue v;
    v.f = f;
    return v;
  }
 
  static FlagValue New_STRING(const char* s) {
    FlagValue v;
    v.s = s;
    return v;
  }
 
  bool b;
  int i;
  double f;
  const char* s;
};
这个联合类型对命令行中键值对中的值进行封装,可以表示四种类型。
 
2.2 命令行中键值的表示 -- Flag
 
这个类是表示一对键值的抽象,包含下列元素:
 
键值对。包括name和variable_表示键和值。如--prefix=/usr中,name的值为prefix,variable_为/usr的一个表示。
链表维护域。Flag *next_用于指向下一个命令行参数。
comment_表示该参数的解释。
file表示和键值相关的外部文件。
default_表示默认情况下,就是用户没有输入该参数的情况下默认的值。
定义友元类FlagList,因为FlagList需要访问Flag的next_域。
class Flag {
 public:
  enum Type { BOOL, INT, FLOAT, STRING };
 
  // Internal use only.  
  Flag(const char* file, const char* name, const char* comment,
       Type type, void* variable, FlagValue default_);
 
  // General flag information  
  const char* file() const  { return file_; }
  const char* name() const  { return name_; }
  const char* comment() const  { return comment_; }
 
  // Flag type  
  Type type() const  { return type_; }
 
  // Flag variables  
  bool* bool_variable() const {
    assert(type_ == BOOL);
    return &variable_->b;
  }
   
  int* int_variable() const {
    assert(type_ == INT);
    return &variable_->i;
  }
   
  double* float_variable() const {
    assert(type_ == FLOAT);
    return &variable_->f;
  }
   
  const char** string_variable() const {
    assert(type_ == STRING);
    return &variable_->s;
  }
 
  // Default values  
  bool bool_default() const {
    assert(type_ == BOOL);
    return default_.b;
  }
   
  int int_default() const {
    assert(type_ == INT);
    return default_.i;
  }
   
  double float_default() const {
    assert(type_ == FLOAT);
    return default_.f;
  }
   
  const char* string_default() const {
    assert(type_ == STRING);
    return default_.s;
  }
 
  // Resets a flag to its default value  
  void SetToDefault();
 
  // Iteration support  
  Flag* next() const  { return next_; }
 
  // Prints flag information. The current flag value is only printed  
  // if print_current_value is set.  
  void Print(bool print_current_value);
 
 private:
  const char* file_;
  const char* name_;
  const char* comment_;
 
  Type type_;
  FlagValue* variable_;
  FlagValue default_;
 
  Flag* next_;
 
  friend class FlagList;  // accesses next_  
};
 

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读