【C++】google gflags详解
参考博客;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详解相关推荐
- 分布式表格系统Google Bigtable详解
分布式表格系统Google Bigtable详解 概述 Bigtable架构 数据分布 保证 副本位置与负载均衡 存储 表的分裂与合并 存储引擎 垃圾回收 总结 概述 bigtable系统由表格组成, ...
- 【NLP】Google BERT详解
版权声明:博文千万条,版权第一条.转载不规范,博主两行泪 https://blog.csdn.net/qq_39521554/article/details/83062188 </div> ...
- Google官方 详解 Android 性能优化【史诗巨著之内存篇】
尊重博主原创,如需转载,请附上本文链接http://blog.csdn.net/chivalrousman/article/details/51553114#t16 为什么关注性能 对于一款APP,用 ...
- 【C++】google glog详解
0.简介 glog是google的日志管理系统,配合gflags库,通过命令行参数管理日志. 源码下载:https://github.com/google/glog ubuntu安装: sudo ap ...
- 【C++】google gtest 详解
1.参考博客: https://blog.csdn.net/baijiwei/article/details/81265491 https://www.cnblogs.com/coderzh/arch ...
- Google工程师详解Android架构
Google的一位工程师Sans Serif发布了一篇博文非常清楚的描述了Android系统架构,中国移动通信研究院院长黄晓庆在新浪微博上推荐了该文,并认为文中对Android的介绍很好,您可以看一下 ...
- Google AutoValue详解
背景 首先说Android Model,在开发中网络请求,以及数据库操作等,我们都会定义一个Model,不同人对这个的说法不一样,比如有Entry,Bean,Pojo. 通常对于实体类,我们需要做如下 ...
- Google官方详解 Activity【项目实例不容错过!】
开始我们的Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对应于其生命周期中特定阶段的特定回调方法在 Activity 实例中启动代码. 有一系列 ...
- BERT原理和结构详解
目录 1. 模型输入 2. 网络结构 2.1 Self-Attention Layer 2.2 Layer Normalization 2.3 BERT 每一层的学习 3. 模型预训练 3.1 训练任 ...
最新文章
- 你需要掌握的三种编程语言
- JS检查是否支持Storage
- PHP实现简易版区块链
- asp中正则表达式应用
- 百余名欧洲议会议员发函 呼吁英国留在欧盟
- 安卓中java或取上下文_android-Xposed:如何获取挂钩的应用程序的上下文?
- 《常见问题集》Maven
- python中plot不能显示标签_解决python中使用plot画图,图不显示的问题
- Python3实现批量下载百度搜索图片
- 彻底解决乱码问题(一):为何会出现乱码
- 记python opencv的一次恶搞
- 同余式 和 费马小定理
- 两个质数互质是_两个数互质是什么意思 如何判断
- 联想ghost重装系统_史上最全的重装ghost系统错误解决方法大全
- 爬虫抓取究竟是什么?
- python -m json.tool的使用
- 飞控中加速度计数据fft分析
- require(): open_basedir restriction in effect. File
- Linux系统语言设置中没有拼音输入法的解决办法
- 若依前后端分离框架——生成数字验证码功能源码学习
热门文章
- HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法
- error LNK2019: 无法解析的外部符号,该符号在函数 _main 中被引用的解决方法
- win10 java applet_win10系统的ie11浏览器无法打开Java applet
- 给python点颜色青少年学编程_早晨送给自己的句子,句句经典励志!
- 只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index、getters、actions、mutations等js文件吧!)
- 【高端】几个关于SCSS中for循环的高级玩法
- 实验三 Gmapping建图
- 在CentOS 6.9 x86_64的nginx 1.12.2上开启标准模块ngx_http_map_module实录
- 从头开始学习Adobe Photoshop CC图像编辑
- 计算TD-LTE DL 峰值速率的工具和相关参数