gflags
gflags是Google开源的一套命令行参数处理的开源库,可以方便高效的处理命令参数。
参数解析
int main(int argc, char** argv){...}
main()函数参数信息保存在argc, argv中,需要遍历解析,为了处理方便,参数的顺序还会有明确的要求。使用gfalgs可以省略解析部分代码,通过调用ParseCommandLineFlags()即完成了参数的解析。
//该函数是解析命令行参数的,所以调用应该在main()入口处。
google::ParseCommandLineFlags(&argc, &argv, true);
gflags是如何解析参数的?
- 程序中需要定义参数名,让程序知道需要识别哪些参数。 如定义一个name参数:
DEFINE_string(name, "Catherine", "this parameter is a name.");
- 执行命令时,需要指定参数格式:
--name="William"
- 调用ParseCommandLineFlags()完成解析,name参数值将保存在全局变量FLAGS_name中。
参数的定义
gflags支持的类型定义方法:
方法名:定义参数的类型
DEFINE_bool: boolean
DEFINE_int32: 32-bit integer
DEFINE_int64: 64-bit integer
DEFINE_uint64: unsigned 64-bit integer
DEFINE_double: double
DEFINE_string: C++ string
DEFINE_xxx方法有三个参数:
- 参数名
- 默认值(命令执行时未指定参数时,参数值为默认值)
- 参数描述
DEFINE_string(name, "Catherine", "this parameter is a name.");
参数的使用
解析后,即可使用全局变量:FLAGS_+参数名,如FLAGS_name
。
如果需要在其他文件(非参数定义的文件)中使用,需要在文件中使用DECLARE_xxx()声明该参数。
//声明方法DECLARE_xxx,xxx类型和参数名要和定义一致,参数只有1个:参数名
DECLARE_string(name)
参数解析的第三参数
google::ParseCommandLineFlags(&argc, &argv, true);
第三个参数为remove_flags,标识解析后,是否要从参数列表中移除。
true:参数信息中将删除gflags相关参数,只保留不是gflags定义的参数。
false:不删除gflags参数,顺序会改变。
一般参数解析后,也没有保留的必要,设置为true就好了。
辅助函数
对于常用的版本和帮助提供了接口设置:
设置版本信息:google::SetVersionString(string);
设置帮助信息:google::SetUsageMessage(string);
执行时制定参数即可
–version:显示版本信息。
–help:显示所有帮助信息,包括自定义的帮助信息和gflags本身的帮助信息。
–helpshort:显示自定义的帮助信息。
例子
#include <gflags/gflags.h>
#include <iostream>
#include <string>
DEFINE_string(para1, "para1", "the first parameter.");
DEFINE_bool(para2, true, "the secode parameter.");
static std::string VersionInfo = "Verion 1.0";
static std::string HelpInfo = "This is help info.";
int main(int argc, char** argv) {
google::SetVersionString(VersionInfo);
google::SetUsageMessage(HelpInfo);
google::ParseCommandLineFlags(&argc, &argv, true);
std::cout << "para1 = " << FLAGS_para1 << std::endl;
std::cout << "para2 = " << FLAGS_para2 << std::endl;
return 0;
}
输出
默认参数
$ ./a.out
para1 = para1
para2 = 1
指定参数
$ ./a.out --para1="mytest" --para2=false
para1 = mytest
para2 = 0
–helpshort
$ ./a.out --helpshort
.out: This is help info.
–version
$ ./a.out --version
a.out version Verion 1.0