文档章节

C++ gflags

SibylY
 SibylY
发布于 08/15 14:27
字数 913
阅读 9
收藏 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

© 著作权归作者所有

共有 人打赏支持
上一篇: c++ std::move
SibylY
粉丝 29
博文 437
码字总数 344084
作品 0
海淀
程序员
私信 提问
35 个你也许不知道的 Google 开源项目

Google是支持开源运动的最大公司之一,它们现在总共发布有超过500个的开源项目(大部分都是利用它们的API来完成),本文将列举一些有趣的开源项目,其中很可能有不少你不知道的哦。 文本文件...

快慢机
2012/04/01
0
0
几个C++内存泄漏和越界检测工具简介

一、BoundsChecker 或许你还不知道大名顶顶的Nu-Mega,但一定听说过他们的产品SoftICE,BoundsChecker也是这家公司的产品。与Visual C++配合使用,据说威力强大。本人和没有实际用过,在此复...

江河海流
2014/05/14
0
0
【转载】数据结构利器之私房STL

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

悠米海
2012/12/02
0
0
《鸡啄米C++编程入门系列》系列技术文章整理收藏

《鸡啄米C++编程入门系列》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201812.html 文章 鸡啄米:C++编程入门系列之前言 鸡啄米:C++编程入门系列之一(进制...

开元中国2015
2015/06/27
0
0
VS2010/MFC编程入门教程之目录和总结(鸡啄米)

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

weixin_40647819
05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用JavaScript编写iOS应用业务逻辑

JSAUIKitCocoa使你可以使用JavaScript编写对性能要求不高但可能变动性很大的iOS应用的业务逻辑部分,View组件、需要多线程支持的Model等则直接使用原生对象。 编写方式与React Native相似,但...

neal01
21分钟前
1
0
艺术品区块链溯源防伪平台(连载一)

Netkiller Blockchain 手札 作者正在找工作,联系方式 13113668890 Mr. Neo Chan, 陈景峯(BG7NYT) 中国广东省深圳市望海路半岛城邦三期 518067 +86 13113668890 <netkiller@msn.com> 文档始创...

netkiller-
21分钟前
2
0
0032-如何在CDH启用Kerberos的情况下安装及使用Sentry(二)

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 5.Sentry列权限管理 1.在集群所有节点添加fayson_r用户 [root@ip-172-31-6-148 cdh-shell-bak]# useradd fayson_r[root@i...

Hadoop实操
25分钟前
1
0
Nginx配置中Location的优先级

根据Nginx的官方文档,Location标签一共有四个修饰符,分别是: (1) =:表示完全匹配; (2) ^~:匹配URI的前缀,并且后面的正则表达式不再匹配,如果一个URI同时满足两个规则的话,匹配最长的规...

cloes
昨天
1
0
Xcode 10 Archive 卡死问题

前段时间贪新鲜更新了xcode 10,发现就是自己没事找事后悔啊........ 首先是 libstdc++.6.0.9.tbd 已不被使用,以前的项目是一顿报错!!!一个个改也不是办法还有一些第三方的用到只好把lib...

壹峰
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部