简介
gflags 是google开源的一套命令行参数解析工具,比 getopt 功能更加强大,使用起来更加方便。用在百度Apollo中gflag被广泛的应用在各种全局变量中,例如节点名,变量名,各种状态标志中。
什么是命令行参数解析工具呢?
这里用linux运行C++可执行文件做例子,例如:./test cmd1 cmd2
其中cmd1和cmd2 就是命令行参数,gflags就是用来解析cmd1 cmd2 到程序中的;在cpp中命令行参数就是字符串
头文件
#include < gflags/gflags.h >
宏定义
将需要的命令行参数使用gflags的宏来定义,例如:DEFINE_xxxxx(变量名,默认值,help-string) 定义在文件当中,注意:是全局的
格式: DEFINE_xxxxx(变量名,默认值,help-string)
DEFINE_string(gps_topic, "/apollo/sensor/gnss/odometry", "GPS topic name");
其中xxxxx是数据类型,如:bool、int32、int64、uint64、double、string
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;
main函数添加
在main函数中开始的地方加入,以下这句话:
google::ParseCommandLineFlags(&argc, &argv, true);
//如果设为true,则该函数处理完成后,argv中只保留argv[0],argc会被设置为1。
//如果为false,则argv和argc会被保留,但是注意函数会调整argv中的顺序。
调用
在后续代码中使用FLAGS_变量名访问对应的命令行参数方法如下:
printf("%s", FLAGS_mystr);
在其他文件中使用定义的flags变量
简介
有些时候需要在main之外的文件使用定义的flags变量,这时候可以使用宏定义DECLARE_xxx(变量名)声明一下
在对应的.h文件中进行DECLARE_xxx声明,需要使用的文件直接include就行了。
例子
格式:DECLARE_xxx(变量名)
DECLARE_bool(enable_adapter_dump);
DECLARE_string(monitor_topic);
支持以下类型:
DECLARE_bool: boolean;
DECLARE_int32: 32-bit integer;
DECLARE_int64: 64-bit integer;
DECLARE_uint64: unsigned 64-bit integer;
DECLARE_double: double;
DECLARE_string: C++ string;
判断flags变量是否被用户使用
在gflags.h中,还定义了一些平常用不到的函数和结构体。这里举一个例子,判断参数port有没有被用户设定过
google::CommandLineFlagInfo info;
if(GetCommandLineFlagInfo("port" ,&info) && info.is_default)
{
FLAGS_port = 27015;
}
定制help信息与version信息
希望对你有帮助。