文档章节

C++ gflags

SibylY
 SibylY
发布于 08/15 14:27
字数 913
阅读 3
收藏 0

gflags是google一个开源的处理命令行参数的库,相比getopt,更加容易使用。

  • 定义参数

gflags主要支持的参数类型包括 DEFINEbool: boolean DEFINEint32: 32-bit integer DEFINEint64: 64-bit integer DEFINEuint64: unsigned 64-bit integer DEFINEdouble: double DEFINEstring: C++string 定义参数通过DEFINE_type宏实现,

该宏的三个参数含义分别为命令行参数名,参数默认值,以及参数的帮助信息。

DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing");

DEFINE_string(languages, "english,french,german", "comma-separated list of languages to offer in the 'lang' menu");

  • 访问参数

使用时通过FLAGS_name就可访问到对应的参数

如果使用时不想在main文件里定义flag,例如需要在flag1.cpp flags.cpp里定义,可以分别声明和定义:
在flags1.cpp flags2.cpp里分别定义各自的flag,然后在flag.h声明,需要使用的文件直接include flags.h就可以了。
声明的函数如下:DECLARE_bool(big_menu) 

  • 解析参数

gflags::ParseCommandLineFlags(&argc, &argv, remove_flags)解析出相应 flags.

remove_flags: 若设置为true,表示解析后将flag以及flag对应的值从argv中删除,并相应的修改argc,即最后存放的是不包含flag的参数。如果设置为false,则仅对参数进行重排,标志位参数放在最前面。 

也可以在命令行传入--flagfile或者在程序里设置flagfile以解析文件中的flags。

google::SetCommandLineOption("flagfile", "gflags_sample.flags");

FLAGS_flagfile更新后,会自动重新读取该文件并更新文件里的gflags。

  • 参数检查

定义参数后,可以给参数注册一个检查函数(validator) 当从命令行指定参数或通过SetCommandLineOption()指定参数时,检查函数就会被调用,两个参数分别为命令行参数名,以及设置的参数值。

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);

如果注册成功,regist函数返回值为ture。否则返回false,注册失败一般是一下两种原因:

  1. 第一个参数不是flag
  2. 该flag已经注册过

使用GetCommandLineFlagInfo判断一个 FLAG是否被设置

google::CommandLineFlagInfo info;
if (GetCommandLineFlagInfo("portno", &info) && info.is_default) {
    std::cout << "port is not set." << std::endl;
} else {
    std::cout << "port is set." << std::endl;
}

 实际项目里,我们使用gflag替代了传统conf配置,其中有一个需求是配置可以动态reload的。
比较合理的是使用SetCommandLineOption,函数原型为

extern std::string SetCommandLineOption(const char* name, const char* value);

注意bool int类型都使用字符串的方式修改,例如:

google::SetCommandLineOption("bvar_dump", "true")

google::SetCommandLineOption("portno", "9999")

 

特殊参数

--help 打印定义过的所有参数的帮助信息 --version 打印版本信息 通过google::SetVersionString()指定 --nodefok 但命令行中出现没有定义的参数时,并不退出(error-exit) --fromenv 从环境变量读取参数值 --fromenv=foo,bar表明要从环境变量读取foo,bar两个参数的值。通过export FLAGSfoo=xxx; export FLAGSbar=yyy 程序就可读到foo,bar的值分别为xxx,yyy。 --tryfromenv 与--fromenv类似,当参数的没有在环境变量定义时,不退出(fatal-exit) --flagfile 从文件读取参数值,--flagfile=my.conf表明要从my.conf文件读取参数的值。在配置文件中指定参数值与在命令行方式类似,另外在flagfile里可进一步通过--flagfile来包含其他的文件。

google::SetCommandLineOption("flagfile", "./conf/gflags.conf");

 

参考:https://izualzhy.cn/gflags-introduction

© 著作权归作者所有

共有 人打赏支持
SibylY
粉丝 29
博文 433
码字总数 343652
作品 0
海淀
程序员
【转载】数据结构利器之私房STL

数据结构利器之私房STL 此系列的文章适合初学有意剖析STL和欲复习STL的同学们。 学过c++的同学相信都有或多或少接触过STL。STL不仅仅是c++中很好的编程工具(这个词可能有点歧义,用类库更恰...

悠米海
2012/12/02
0
0
C++基础教程之C/C++区别

C/C++基础教程之C/C++区别 这是C++教程得第一步,后续会持续更新哦!欢迎新手(具有C基础),老鸟可绕道,可指导。 C++标准输入和输出 C++标准输入和输出分别是cin和cout,用法非常简单 cin>>n...

这个人很懒什么都没留下
09/01
0
0
C#调用C的Dll(类型对照)

C#调用C的DLL //C++中的DLL函数原型为 //extern "C" declspec(dllexport) bool 方法名一(const char 变量名1, unsigned char 变量名2) //extern "C" declspec(dllexport) bool 方法名二(cons......

KavenSu
2014/04/30
0
0
VS2010/MFC编程入门教程之目录和总结(鸡啄米)

鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够。以此教程的知识为基础,学习VS2010/MFC较为深入的内容已非难事...

weixin_40647819
05/23
0
0
Visual Studio 2012 Build Clang

不知道还有没有人记得Borland C/C++,C/C++四国圣战中的主角,换了老板 如今还在不冷不热的发展 ,支持Win32/Win64 OSX平台,即Embarcadero C++ Builder 现在支持Windows 64编程 最近试了一下...

Force武装卫队
2013/01/14
0
24

没有更多内容

加载失败,请刷新页面

加载更多

nginx 负载均衡

一.配置方式 1.轮询(默认) 优点:实现简单; 缺点:不考虑每台服务器处理能力 2.权重 weight默认是1。如果有多个配置权重的节点,比较相对值。 15:10,只代表访问8080端口的概率是访问908...

imbiao
38分钟前
1
0
jQuery学习笔记180923

jQuery 操作 CSS jQuery 拥有若干进行 CSS 操作的方法。我们将学习下面这些: addClass() - 向被选元素添加一个或多个类 removeClass() - 从被选元素删除一个或多个类 toggleClass() - 对被选...

颖伙虫
50分钟前
1
0
[python] colorama 模块 - 改变控制台输出文本的颜色

除了使用 PyQt 这样的图形化开发框架外,基本上 python 程序都是跑在控制台中的。很多时候,单纯使用黑白的文字不能很好地突出我们要显示的信息。有时候我们需要将错误的提示使用红色标注,而...

cometeme
55分钟前
1
0
Makefile 学习 2 - 基于若干 Blog 的汇总

基于若干 Blog 汇总的 makefile 教程 陈皓 https://blog.csdn.net/haoel/article/details/2886 Makefile 进阶 1. Makefile 中的内容 显式规则。显式规则说明了,如何生成一个或多的的目标文件...

公孙衍
今天
1
0
NIO与BIO的区别、NIO的运行原理和并发使用场景

NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的...

Java干货分享
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部