后端系统开发利器,gflags概述

简介

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);
 
  // 使用gflags
  if (FLAGS_foo) {
    std::cout << "foo is true" << std::endl;
  } else {
    std::cout << "foo is false" << std::endl;
  }
 
  // 使用gflags
  int 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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值