【C++】google gflags库
来源:互联网 发布:网络黄金通缉人名单 编辑:程序博客网 时间:2024/05/19 15:21
介绍
gflags
是google
的一个开源的处理命令行参数的库,使用c++
开发,具备python
接口,可以替代getopt
。gflags
使用起来比getopt
方便,但是不支持参数的简写(例如getopt
支持--list
缩写成-l
,gflags
不支持)。
安装
暂留(TODO)
基础使用
- 需要引用头文件
#include <gflags/gflags.h>
在使用命令行参数的文件文件中(源文件或头文件),首先使用一下定义语句进行变量的定义:
DEFINE_int32DEFINE_int64DEFINE_uint64DEFINE_boolDEFINE_doubleDEFINE_string
定义的语句的使用方法:
DEFINE_int32(name, default_value, "description");
在main函数中加入:(一般是放在main函数的头几行,越早了解用户的需求越好)
google::ParseCommandLineFlags(&argc, &argv, true);
argc
和argv
想必大家都很清楚了,说明以下第三个参数的作用:
如果设为true
,则该函数处理完成后,argv
中只保留argv[0],argc
会被设置为1。
如果为false
,则argv
和argc
会被保留,但是注意函数会调整argv
中的顺序。这样,在后续代码中可以使用FLAGS_变量名访问对应的命令行参数了
printf("%s", FLAGS_name);
最后,编译成可执行文件之后,用户可以使用:
executable --参数1=值1 --参数2=值2 ...
来为这些命令行参数赋值。
例如:./mycmd --var1="test" --var2=3.141592654 --var3=32767 --mybool1=true --mybool2 --nomybool3
这里值得注意的是bool
类型命令行参数,除了可以使用--xxx=true/false
之外,还可以使用--xxx
和--noxxx
后面不加等号的方式指定true
和false
同时也可以将参数配置到一个文件中例如
gflag.conf
,可以直接使用配置文件传递参数./mycmd --flagfile=gflag.conf
举个栗子来说明一下
#include <stdio.h>#include <gflags/gflags.h>#include <iostream>DEFINE_string(name,"name_null","name");DEFINE_int32(age,0,"");DEFINE_string(school,"none","");DEFINE_string(sex,"none","");DEFINE_bool(marriage,true,"");int main(int argc, char** argv){ google::ParseCommandLineFlags(&argc, &argv, true); std::cout << "my name is :" << FLAGS_name << std::endl << "my age is :" << FLAGS_age << std::endl << "my school is :" << FLAGS_school << std::endl; return 0;}
编译后生成test_gflags
可执行程序.
- 运行
./test_gflags --name=fang
,结果如下
my name is :fangmy age is :0my school is :none
- 写配置文件gflag_conf.conf
--name=frank--age=25--sex=man--school=pku--marriage=false
运行./test_gflags --flagfile=gflag_conf.conf
,结果如下:
my name is :frankmy age is :25my school is :pku
- 如果修改配置文件为
--name= frank--age=25--sex=man--school=pku--marriage=false
会得出一样的结论,证明--name=frank
这里的等于号后面可以接空格
- 如果修改配置文件为
--name =frank--age=25--sex=man--school=pku--marriage=false
结果中name的值变为默认值,说明等于号前面不能是空格。
结论:
--name=frank
这里的等于号后面可以接空格,但是前面不能,不会报错,但是会使用默认值。
- 同时使用配置文件和传入参数
[fangjin@cp01-rdqa-dev168.cp01.baidu.com 003_learn_gflags]$ ./test_gflags --flagfile=gflag_conf.conf --name=fangmy name is :fangmy age is :25my school is :pku[fangjin@cp01-rdqa-dev168.cp01.baidu.com 003_learn_gflags]$ ./test_gflags --name=fang --flagfile=gflag_conf.conf my name is :frankmy age is :25my school is :pku[fangjin@cp01-rdqa-dev168.cp01.baidu.com 003_learn_gflags]$ ./test_gflags --name=fang --flagfile=gflag_conf.conf --name=jinmy name is :jinmy age is :25my school is :pku
可见跟参数传入的顺序有关系,或者说是可以被覆盖的。建议使用配置文件的方式,更加方便。
进阶使用
在其他文件中使用定义的
flags
变量:有些时候需要在main
之外的文件使用定义的flags
变量,这时候可以使用宏定义DECLARE_xxx(变量名)
声明一下(就和c++
中全局变量的使用是一样的,extern
一下一样)DECLARE_bool: booleanDECLARE_int32: 32-bit integerDECLARE_int64: 64-bit integerDECLARE_uint64: unsigned 64-bit integerDECLARE_double: doubleDECLARE_string: C++ string
在
gflags
的doc
中,推荐在对应的.h
文件中进行DECLARE_xxx
声明,需要使用的文件直接include
就行了。检验输入参数是否合法:
gflags
库支持定制自己的输入参数检查的函数,如下:static bool ValidatePort(const char* flagname, int32 value) { if (value > 0 && value < 32768) // value is ok return true; printf("Invalid value for --%s: %d\n", flagname, (int)value); return false;}DEFINE_int32(port, 0, "What port to listen on");static const bool port_dummy = RegisterFlagValidator(&FLAGS_port, &ValidatePort);
判断
flags
变量是否被用户使用:在gflags.h
中,还定义了一些平常用不到的函数和结构体。这里举一个例子,判断参数port
有没有被用户设定过google::CommandLineFlagInfo info; if(GetCommandLineFlagInfo("port" ,&info) && info.is_default) { FLAGS_port = 27015; }
定制你自己的
help
信息与version
信息:(gflags
里面已经定义了-h
和--version
,你可以通过以下方式定制它们的内容)version
信息:使用google::SetVersionString
设定,使用google::VersionString
访问help
信息:使用google::SetUsageMessage
设定,使用google::ProgramUsage
访问
注意:
google::SetUsageMessage
和google::SetVersionString
必须在google::ParseCommandLineFlags
之前执行特殊参数
--help
打印定义过的所有参数的帮助信息
+--version
打印版本信息 通过google::SetVersionString()
指定--nodefok
但命令行中出现没有定义的参数时,并不退出(error-exit)
--fromenv
从环境变量读取参数值--fromenv=foo,bar
表明要从环境变量读取foo,bar
两个参数的值。通过export FLAGS_foo=xxx; export FLAGS_bar=yyy
程序就可读到foo,bar
的值分别为xxx,yyy
。--tryfromenv
与--fromenv
类似,当参数的没有在环境变量定义时,不退出(fatal-exit)
--flagfile
从文件读取参数值,--flagfile=my.conf
表明要从my.conf
文件读取参数的值。在配置文件中指定参数值与在命令行方式类似,另外在flagfile
里可进一步通过--flagfile
来包含其他的文件。
参考自 http://blog.csdn.net/lezardfu/article/details/23753741
- 【C++】google gflags库
- google gflags 库完全使用
- Google gflags
- Google gflags库(解析命令行参数)
- google gflags 使用方法
- Google gflags使用说明
- Google gflags安装
- Google gflags介绍
- Google gflags使用说明
- Google gflags使用说明
- Google gflags使用说明
- google gflags 使用1
- google gflags 使用2
- Google gflags 的使用
- Google gflags使用说明
- Google开源命令行参数解析库gflags
- Google开源命令行参数解析库gflags
- Google gflags使用说明(处理命令行参数的库)
- STL入门
- Servelet获取properties的几种方法
- 同步,异步,阻塞,非阻塞 摘抄
- Same Tree
- 第一篇博客吧
- 【C++】google gflags库
- GTX1080+ ubuntu14.04+cuda8.0 配置安装
- 详解协方差与协方差矩阵
- 第三周项目3-求集合并集
- 脏读,不可重复读,幻读与事务隔离
- JAVA进阶4.1——集合类简介
- 罗辑思维的三个战略阶段
- poj 1062 昂贵的聘礼
- docker入门