参考博客;https://blog.csdn.net/lezardfu/article/details/23753741

0、简介

gflags是google的一个开源的处理命令行参数的库,使用c++开发,具备python接口,可以替代getopt。gflags使用起来比getopt方便,但是不支持参数的简写(例如getopt支持–list缩写成-l,gflags不支持)。
gflags 源码下载地址: https://github.com/gflags/gflags
官方说明文档:https://gflags.github.io/gflags/
ubuntu下使用命令安装:

sudo apt-get install libgflags*
1、命令行标记 和 命令行参数

例如:fgrep -l -f /var/tmp/foo johannes brahms
“-l” 和 “-f /var/tmp/foo”是命令行标记;
“johannes” 和 “brahms”是命令行参数
注意:gflags只能处理命令行标记(Commandline flags ),不会处理命令行参数(commandline arguments)

2、定义命令行标记

头文件:#include <gflags/gflags.h>
支持的数据类型:
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
例如:
DEFINE_bool(quiet, true, “打印详细信息”);
DEFINE_string(infile, “”, “输入文件”);
格式说明:
DEFINE宏有三个参数:标志的名称、默认值以及描述其用法的字符串,当使用–help命令行标记时,会打印这些说明信息

3、使用命令行标记

使用“FLAGS_”前缀的宏,来访问命令行标记
例如:

  //首先通过gflags来分析命令行标记gflags::ParseCommandLineFlags(&argc, &argv, true); if (FLAGS_quiet){std::cout << "hello world" << std::endl;std::cout << "fileName = " << FLAGS_infile << std::endl;;}
4、gflgs常用函数(参见头文件《gflags.h》)
//使用--version时,显示版本信息
void SetVersionString(const std::string& version);
//使用--help时,显示帮助信息,不用添加命令行标志的信息,命令行标志的信息在宏 DEFINE_ 中已经添加了
void SetUsageMessage(const std::string& usage)
//主动打印帮助信息
void ShowUsageWithFlags(const char *argv0);
//主动打印帮助信息,参数restrict表示显示哪个文件中使用宏 DEFINE_ 定义的命令行标记
void ShowUsageWithFlagsRestrict(const char *argv0, const char *restrict);

例如:在flagsV2.cpp中使用宏 DEFINE_ 定义了命令行标记,
1> 如果只打印flagsV2.cpp中定义的命令行标记,使用如下函数

gflags::ShowUsageWithFlagsRestrict(argv[0], "flagsV2");

打印信息:

$ ./flagsV2
flagsV2: 用法: flags <子命令> <参数>子命令列表:cmd1 这个是子命令Flags from flagsV2.cpp:-infile (输入文件) type: string default: ""-quiet (打印详细信息) type: bool default: false

2> 如果要打印全部信息,包括gflags本身的一些命令行标记,使用如下函数

 gflags::ShowUsageWithFlags(argv[0]);
//或者 gflags::ShowUsageWithFlagsRestrict(argv[0], "");
//只要restrict形参不是flagsV2(或者flagsV2的子串,如flag)

打印信息:

$ ./flagsV2t
flagsV2: 用法: flags <子命令> <参数>子命令列表:cmd1 这个是子命令Flags from flagsV2.cpp:-infile (输入文件) type: string default: ""-quiet (打印详细信息) type: bool default: falseFlags from src/gflags.cc:-flagfile (load flags from file) type: string default: ""-fromenv (set flags from the environment [use 'export FLAGS_flag1=value'])type: string default: ""-tryfromenv (set flags from the environment if present) type: stringdefault: ""-undefok (comma-separated list of flag names that it is okay to specify onthe command line even if the program does not define a flag with thatname.  IMPORTANT: flags in this list that have arguments MUST use theflag=value format) type: string default: ""Flags from src/gflags_completions.cc:-tab_completion_columns (Number of columns to use in output for tabcompletion) type: int32 default: 80-tab_completion_word (If non-empty, HandleCommandLineCompletions() willhijack the process and attempt to do bash-style command line flagcompletion on this value.) type: string default: ""Flags from src/gflags_reporting.cc:-help (show help on all flags [tip: all flags can have two dashes])type: bool default: false-helpfull (show help on all flags -- same as -help) type: booldefault: false-helpmatch (show help on modules whose name contains the specified substr)type: string default: ""-helpon (show help on the modules named by this flag value) type: stringdefault: ""-helppackage (show help on all modules in the main package) type: booldefault: false-helpshort (show help on only the main module for this program) type: booldefault: false-helpxml (produce an xml version of help) type: bool default: false-version (show version and build info and exit) type: bool default: false
5、最简单的示例
#include <gflags/gflags.h>
#include <iostream>#ifndef GFLAGS_GFLAGS_H_
namespace gflags = google;
#endif  // GFLAGS_GFLAGS_H_DEFINE_bool(quiet, true, "打印详细信息");
DEFINE_string(infile, "", "输入文件");int main(int argc, char** argv){gflags::ParseCommandLineFlags(&argc, &argv, true);if (FLAGS_quiet){std::cout << "hello world" << std::endl;std::cout << "fileName = " << FLAGS_infile << std::endl;;}
}

编译时,需要链接gflags: -lgflags

g++ -o flagsV0 flagsV0.cpp -lgflags
6、使用子命令的方法

原理是,利用gflags不会处理命令行参数,只处理命令行标记的特性

#include <gflags/gflags.h>
#include <iostream>#ifndef GFLAGS_GFLAGS_H_
namespace gflags = google;
#endif  // GFLAGS_GFLAGS_H_DEFINE_bool(quiet, false, "打印详细信息");
DEFINE_string(infile, "", "输入文件");int main(int argc, char** argv){gflags::SetUsageMessage("用法: flags <子命令> <参数>\n\n""子命令列表:\n""  cmd1 这个是子命令\n");gflags::ParseCommandLineFlags(&argc, &argv, true);if(argc!=2){//gflags::ShowUsageWithFlagsRestrict(argv[0], "aaa");gflags::ShowUsageWithFlagsRestrict(argv[0], "flagsV2");//gflags::ShowUsageWithFlags(argv[0]);return 0;}if (FLAGS_quiet){std::cout << "hello world" << std::endl;std::cout << "fileName = " << FLAGS_infile << std::endl;;}
}

【C++】google gflags详解相关推荐

  1. 分布式表格系统Google Bigtable详解

    分布式表格系统Google Bigtable详解 概述 Bigtable架构 数据分布 保证 副本位置与负载均衡 存储 表的分裂与合并 存储引擎 垃圾回收 总结 概述 bigtable系统由表格组成, ...

  2. 【NLP】Google BERT详解

    版权声明:博文千万条,版权第一条.转载不规范,博主两行泪 https://blog.csdn.net/qq_39521554/article/details/83062188 </div> ...

  3. Google官方 详解 Android 性能优化【史诗巨著之内存篇】

    尊重博主原创,如需转载,请附上本文链接http://blog.csdn.net/chivalrousman/article/details/51553114#t16 为什么关注性能 对于一款APP,用 ...

  4. 【C++】google glog详解

    0.简介 glog是google的日志管理系统,配合gflags库,通过命令行参数管理日志. 源码下载:https://github.com/google/glog ubuntu安装: sudo ap ...

  5. 【C++】google gtest 详解

    1.参考博客: https://blog.csdn.net/baijiwei/article/details/81265491 https://www.cnblogs.com/coderzh/arch ...

  6. Google工程师详解Android架构

    Google的一位工程师Sans Serif发布了一篇博文非常清楚的描述了Android系统架构,中国移动通信研究院院长黄晓庆在新浪微博上推荐了该文,并认为文中对Android的介绍很好,您可以看一下 ...

  7. Google AutoValue详解

    背景 首先说Android Model,在开发中网络请求,以及数据库操作等,我们都会定义一个Model,不同人对这个的说法不一样,比如有Entry,Bean,Pojo. 通常对于实体类,我们需要做如下 ...

  8. Google官方详解 Activity【项目实例不容错过!】

    开始我们的Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对应于其生命周期中特定阶段的特定回调方法在 Activity 实例中启动代码. 有一系列 ...

  9. BERT原理和结构详解

    目录 1. 模型输入 2. 网络结构 2.1 Self-Attention Layer 2.2 Layer Normalization 2.3 BERT 每一层的学习 3. 模型预训练 3.1 训练任 ...

最新文章

  1. 你需要掌握的三种编程语言
  2. JS检查是否支持Storage
  3. PHP实现简易版区块链
  4. asp中正则表达式应用
  5. 百余名欧洲议会议员发函 呼吁英国留在欧盟
  6. 安卓中java或取上下文_android-Xposed:如何获取挂钩的应用程序的上下文?
  7. 《常见问题集》Maven
  8. python中plot不能显示标签_解决python中使用plot画图,图不显示的问题
  9. Python3实现批量下载百度搜索图片
  10. 彻底解决乱码问题(一):为何会出现乱码
  11. 记python opencv的一次恶搞
  12. 同余式 和 费马小定理
  13. 两个质数互质是_两个数互质是什么意思 如何判断
  14. 联想ghost重装系统_史上最全的重装ghost系统错误解决方法大全
  15. 爬虫抓取究竟是什么?
  16. python -m json.tool的使用
  17. 飞控中加速度计数据fft分析
  18. require(): open_basedir restriction in effect. File
  19. Linux系统语言设置中没有拼音输入法的解决办法
  20. 若依前后端分离框架——生成数字验证码功能源码学习

热门文章

  1. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法
  2. error LNK2019: 无法解析的外部符号,该符号在函数 _main 中被引用的解决方法
  3. win10 java applet_win10系统的ie11浏览器无法打开Java applet
  4. 给python点颜色青少年学编程_早晨送给自己的句子,句句经典励志!
  5. 只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index、getters、actions、mutations等js文件吧!)
  6. 【高端】几个关于SCSS中for循环的高级玩法
  7. 实验三 Gmapping建图
  8. 在CentOS 6.9 x86_64的nginx 1.12.2上开启标准模块ngx_http_map_module实录
  9. 从头开始学习Adobe Photoshop CC图像编辑
  10. 计算TD-LTE DL 峰值速率的工具和相关参数