简介

gflags是Google的一个开源项目,用于解析程序运行参数。gflags简单易用,它的好处在于统一配置格式,减少开发工作量。在工程实践中,gflags在简化开发和测试方面表现非常出色,它还有一个很棒的功能是支持多人合作开发。gflags在2008年首次推出,至今已有10年时间,目前有很多公司都在用gflags。

使用

下面的例子简单展示了C++语言中gflags的基本用法。

simple_gflags.cpp

#include <iostream>
#include "gflags/gflags.h"  // 定义gflags
DEFINE_bool(foo, false, "a simple gflags named foo, default value is flase, wuruilong, 2018-08-16");
DEFINE_int32(thread_num, 10, "thread number, default value is 10, wuruilong, 2018-08-16");int main(int argc, char **argv) {// 解析gflags参数,只需要1行代码google::ParseCommandLineFlags(&argc, &argv, true);// 使用gflagsif (FLAGS_foo) {std::cout << "foo is true" << std::endl;} else {std::cout << "foo is false" << std::endl;}// 使用gflagsint thread_num = FLAGS_thread_num;std::cout << "thread number:" << thread_num << std::endl;return 0;
}

编译:g++ simple_gflags.cpp -I./gflags-2.0/src -L./ -lgflags

运行:

(1)没有参数,./a.out

foo is false
thread number:10

(2)指定参数foo为true,./a.out -foo=true

foo is true
thread number:10

(3)同时指定foo和thread_num,./a.out -foo=true -thread_num=99

foo is true
thread number:99

上面的例子过于简单,目的是为了消除初学者对gflags的陌生和恐惧感。在工程实践中,有专门定义gflags的文件,通过--flagfile=filename来指定gflags配置文件,其他文件在使用gflags时需要先声明;通常将gflags定义在专门的配置文件中,以方便对程序运行参数管理。

工程例子

下面是工程实践中使用gflags的例子,新开发的功能用bool类型的gflags包住,新旧代码互不干扰,在gflags开关没有打开时,就好像没有这段代码一样。从这个例子中可以看到gflags在多人开发模式中也能发挥很大的作用。

专门定义gflags的头文件gflags_def.cpp

#include "gflags/gflags.h"// 定义gflags
DEFINE_bool(add_new_feature_x, false, "x feature, gaojingying, 2018-08-16");
DEFINE_bool(add_new_featrue_y, false, "y feature, xiechao, 2018-08-16");
DEFINE_bool(fix_memory_leak_bug, false, "fix memory leak bug, xiechao, 2018-08-16");
DEFINE_bool(fix_cpu_high_bug, false, "fix cpu high bug, xiechao, 2018-08-16");
DEFINE_int32(thread_pool_worker_num, 10, "thread pool worker number, default value is 10, ligang, 2018-08-16");
DEFINE_string(server_ip, "127.0.0.1", "x server's ip address, gaojingying, 2018-08-16");

其他文件中使用gflags之前,需要先通过DECLARE_声明。

#include <iostream>
#include <string>
#include <cstdio>
#include "gflags/gflags.h"// 声明gflags
DECLARE_bool(add_new_feature_x);
DECLARE_bool(add_new_featrue_y);
DECLARE_bool(fix_memory_leak_bug);
DECLARE_bool(fix_cpu_high_bug);
DECLARE_int32(thread_pool_worker_num);
DECLARE_string(server_ip);void Work(std::string &name) {name = "feature";// 启用x功能if (FLAGS_add_new_feature_x) {name += "_x";}// 启用y功能if (FLAGS_add_new_featrue_y) {name += "_y";}char *value = new char[100];snprintf(value, 100, "thread number: %d", FLAGS_thread_pool_worker_num);name = name + "," + value + "," + FLAGS_server_ip;// 留下消缺记录if (FLAGS_fix_memory_leak_bug) {delete []value;}
}int main(int argc, char **argv) {google::ParseCommandLineFlags(&argc, &argv, true);std::string name;Work(name);std::cout << name << std::endl;return 0;
}

编译:g++ main.cpp gflags_def.cpp –I./gflags-2.0/src -L./ -lgflags

gflags配置文件demo_project.gflags

-add_new_feature_x=false
-add_new_featrue_y=true
-fix_memory_leak_bug=true
-fix_cpu_high_bug=false
-thread_pool_worker_num=20
-server_ip="127.0.0.1"

运行。

(1)不指定gflags配置文件,./a.out

feature,thread number: 10,127.0.0.1

(2)指定gflags配置文件,./a.out --flagfile=demo_project.gflags

feature_x,thread number: 20,"127.0.0.1"

有了gflags,测试同学会这样玩:

修改demo_project.gflags,关闭feature_x功能,启用feature_y功能:./a.out --flagfile=demo_project.gflags

feature_y,thread number: 20,"127.0.0.1"

至此,你已经掌握了gflags的基本用法。下面要介绍的内容,有利于全面认识gflags。

了解更多

A、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

B、gflags的名字空间:DEFINE_XXX和DECLARE_XXX都是全局命名空间。

C、常用的特殊flag

--help             显示所有文件的所有flag,按文件、名称排序,显示flag名、默认值和帮助

--helpshort      只显示执行文件中包含的flag,通常是 main() 所在文件

--version         打印执行文件的版本信息

D、Github上的gflags项目:https://github.com/gflags/gflags

后端系统开发利器,gflags概述相关推荐

  1. 后端系统开发之白名单机制

    前言 后端系统中经常会听到"某某白名单"的名字,为什么要有白名单呢?使用白名单机制有什么好处? 在大型后端系统中,白名单机制是必不可少的 概念 白名单的概念与"黑名单&q ...

  2. MIS系统开发利器,快速的字典录入解决方案,另类的、可管理的.NET DataWindow

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  3. 后端系统开发之异常情况处理

    智者千虑,必有一失.异常情况总是存在的,我们考虑不到全部场景.美剧<越狱>中精心策划一切的男主也做不到,例如男主意外烫伤导致纹身地图被毁.面对异常我们通常有两种选择,要么让它core掉,要 ...

  4. 【软件工程】软件工程系统开发——系统设计概述

    halo~我是bay_Tong桐小白 本文内容是桐小白个人对所学知识进行的总结和分享,知识点会不定期进行编辑更新和完善,了解最近更新内容可参看更新日志,欢迎各位大神留言.指点 软件工程系统开发--系统 ...

  5. 合成作战系统开发解决方案,重点人员管控平台建设

    合成作战系统开发解决方案,重点人员管控平台建设 合成作战系统通过共享.整合.清洗,丰富案件侦办基础信息库:通过服务对接.工具集成,提供高效专业的情报研判分析工具:以案件为中心.人员为突破口.情报分析为 ...

  6. 安居客住房系统-基于Python-Django前后端分离开发(一)——初始化项目及ORM关系映射

    "安居客"住房系统-基于Python-Django前后端分离开发 作者:代昌松 项目详情代码请参加我的代码仓库:https://gitee.com/dcstempt_ping/iz ...

  7. 014-Axios Ajax:前后端分离概述,发送json类型的参数,前后端分离开发:在线接口文档,前端工程化、Element、nginx

    第一节 Ajax概述 1.概述 概念: Asynchronous JavaScript And XML,异步的JavaScript和XML. 作用: 数据交换:通过Ajax可以给服务器发送请求,并获取 ...

  8. SpringBoot+Vue博客系统---后端接口开发

    Java后端接口开发 从零开始搭建一个项目骨架,最好选择合适,熟悉的技术,并且在未来易拓展,适合微服务化体系等.所以一般以Springboot作为我们的框架基础,这是离不开的了. 然后数据层,我们常用 ...

  9. WDK学习笔记_基于区块链溯源系统的后端接口开发

    文章目录 摘要 一.fabric-go-sdk各个封装函数的功能介绍 1.1 查询指定节点通道是否已经存在(函数: QuerySavedChannel(...) ) 1.2 创建并加入通道(函数: C ...

  10. “安居客“住房系统-基于Python-Django前后端分离开发(二)——基于RESTful架构的数据接口配置以及Redis高速缓存

    "安居客"住房系统-基于Python-Django前后端分离开发(二) 基于Django-Rest-Framework创建接口数据(二) 文章目录 "安居客"住 ...

最新文章

  1. scrapy-splash抓取动态数据例子八
  2. 防火墙问题 Linux系统 /etc/sysconfig/路径下无iptables文件
  3. java suppresslint_Java 注解用法详解——@SuppressWarnings
  4. rust怎么建柱子_小报:捷达VS5安全带卡扣向里?敲B柱?怎么掰回来? 第191220期...
  5. C++ Pitfalls 之 reference to an object in a dynamically allocated containter
  6. 动态规划之状态压缩DP
  7. 【安装配置】SAS9.4安装
  8. 杭电、POJ、ZOJ ACM刷题顺序和题目分类详解
  9. 如何打开后缀为.xps的文件?
  10. 华为鸿蒙名称由来英文简介,华为鸿蒙出世!中国科研人的那些神仙翻译
  11. C++训练:自由落体问题
  12. 微服务Spring Boot 整合 Redis 实现好友关注 – Feed流实现推送到粉丝收件箱
  13. 学习-Python列表之列表应用之降序排列
  14. 判断BIOS的启动模式和磁盘分区格式
  15. Chrome的隐身模式
  16. 影视处理计算机配置,影视后期制作需要什么样的电脑配置
  17. delphi 修改代码补全的快捷键(由Ctrl+Space 改为 Ctrl + alt + Space)
  18. IBM安全产品--QRadar
  19. 使用spring注解注入bean
  20. 预测和健康管理原则(PHM)

热门文章

  1. Mybatis-Plus:Sql 注入器(扩展BaseMapper)
  2. kvaser在linux下的二次开发
  3. 微信公众号平台开发各种错误返回码一览表
  4. 计算机考研去航空专业,北京航空航天大学计算机专业考研方向有哪些?
  5. java---金额中文大小写实时转换小程序
  6. Python中计算二重积分
  7. 华为钱包扫码云闪付_Huawei Pay开通与使用银联云闪付教程
  8. python3 爬虫https的坑 -- 已解决
  9. 3D打印社团的建立和一年的经营
  10. 深信服 AC上网 行为管理设置