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_ }; ![]() (编辑:云计算网_泰州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读