Gflags 简明使用
简介
Google 的 gflags 是一套命令行参数处理的开源库。比 getopt 更方便,更功能强大,从 C++的库更好的支持 C++(如 C++的 string 类型)。包括 C++的版本和 python 的版本。 这里只针对 C++版本,python 版本的使用类似。主要内容参考与翻译自官方文档:http://gflags.googlecode.com/svn/trunk/doc/gflags.html
你能从这里下载本文章的源代码工程。
example 源代码先看 example 源代码,然后逐步介绍。
#include <gflags/gflags.h> 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"); int main(int argc, char **argv) {
google::ParseCommandLineFlags(&argc, &argv, true); cout << "argc=" << argc << endl;
if (FLAGS_big_menu) {
cout << "big menu is ture" << endl;
} else {
cout << "big menu is flase" << endl;
} cout << "languages=" << FLAGS_languages << endl;
return ;
}
运行程序
- 直接运行
➜ bin ./sample
argc=
big menu is ture
languages=english,french,german
- help 命令
➜ bin ./sample --help
sample: Warning: SetUsageMessage() never called Flags from /home/shougang/workspace/drive/Google/cmake_cpp_gflags/src/sample.cc:
-big_menu (Include 'advanced' options in the menu listing) type: bool
default: true
-languages (comma-separated list of languages to offer in the 'lang' menu)
type: string default: "english,french,german" Flags from src/gflags.cc:
-flagfile (load flags from file) type: string default: ""
......... ➜ bin ./sample --helpshort
sample: Warning: SetUsageMessage() never called Flags from /home/shougang/workspace/drive/Google/cmake_cpp_gflags/src/sample.cc:
-big_menu (Include 'advanced' options in the menu listing) type: bool
default: true
-languages (comma-separated list of languages to offer in the 'lang' menu)
type: string default: "english,french,german"
在程序里定义参数
### 包含头文件
#include <gflags/gflags.h>
利用 gflag 提供的宏定义参数该宏的 3 个参数分别为命令行参数名,参数默认值,参数的帮助信息。
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");
gflags 暂时支持如下参数的类型:
DEFINE_bool: boolean
DEFINE_int32: -bit integer
DEFINE_int64: -bit integer
DEFINE_uint64: unsigned -bit integer
DEFINE_double: double
DEFINE_string: C++ string
访问参数
通过 FLAGS_name 像正常变量一样访问标志参数。在这个程序中,通过 FLAGS_big_menu和FLAGS_languages访问它们。
不同文件访问参数
如果想再另外一个不是定义这个参数的文件访问这个参数的话,以参数 FLAGS_big_menu为例,用宏DECLARE_bool(big_menu)来声明引入这个参数。这个宏相当于做了extern FLAGS_big_menu.
整合一起,初始化所有参数
定义号参数后,最后要告诉执行程序去处理命令行传入的参数,使得 FLAGS_*参数们得到正确赋值。
通常就是再main()函数中调用;
google::ParseCommandLineFlags(&argc, &argv, true);
argc和argv就是 main 的入口参数,因为这个函数会改变他们的值,所以都是以指针传入。
第三个参数被称为remove_flags。如果它是true,ParseCommandLineFlags会从argv中移除标识和它们的参数,相应减少argc的值。然后 argv 只保留命令行参数。
相反,remove_flags是false,ParseCommandLineFlags会保留argc不变,但将会重新调整它们的顺序,使得标识再前面。
Note: ./sample --big_menu=false arg1中再big_menu是标识,false是它的参数,arg1是命令行参数。
命令行设置参数
gflags 提供多种命令行设置参数。
string和int之类,可以用如下方式:
app_containing_foo --languages="chinese,japanese,korean"
app_containing_foo -languages="chinese,japanese,korean"
app_containing_foo --languages "chinese,japanese,korean"
app_containing_foo -languages "chinese,japanese,korean"
对于boolean的标识来说,用如下方式:
app_containing_foo --big_menu
app_containing_foo --nobig_menu
app_containing_foo --big_menu=true
app_containing_foo --big_menu=false
和getopt()一样,--将会终止标识的处理。所以在foo -f1 1 -- -f2 2中, f1被认为是一个标识,但f2不会。
特殊标识
--help 显示文件中所有标识的完整帮助信息
--helpfull 和-help 一样,
--helpshort 只显示当前执行文件里的标志
--helpxml 以 xml 凡是打印,方便处理
--version 打印版本信息,由 google::SetVersionString()设定
--flagfile -flagfile=f 从文件 f 中读取命令行参数
...
具体见:http://gflags.googlecode.com/svn/trunk/doc/gflags.html
转自:http://dreamrunner.org/blog/2014/03/09/gflags-jian-ming-shi-yong/
Gflags 简明使用的更多相关文章
- 循序渐进做项目系列(5):制作安装包,谁人都可以!——VS制作安装包简明教程
一开始让我做安装包的时候,其实我是拒绝的.因为我根本就不会做安装包.查了资料之后,我很懵,很晕,很乱,因为不清晰,不简明,不直白.然而经过一番彷徨的挣扎,我终于发现:制作安装包,谁人都可以!故挥狼毫, ...
- 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)
小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...
- 2013 duilib入门简明教程 -- 界面布局(9)
上一个教程实现的标题栏代码中,并没有看到处理自适应窗口大小的代码,但是窗口大小变化后,按钮的位置会跟着变化,这是因为我们将按钮放到了HorizontalLayout.VerticalLayou ...
- 2013 duilib入门简明教程 -- 部分bug (11)
一.WindowImplBase的bug 在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题, 1.最大化按钮的样式 ...
- 2013 duilib入门简明教程 -- 部分bug 2 (14)
上一个教程中提到了ActiveX的Bug,即如果主窗口直接用变量生成,则关闭窗口时会产生崩溃 如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口 ...
- 2013 duilib入门简明教程 -- 自绘控件 (15)
在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如 ...
- 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)
界面的显示方面就都讲完啦,下面来介绍下控件的响应. 前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEG ...
- 2013 duilib入门简明教程 -- FAQ (19)
虽然前面的教程几乎把所有的知识点都罗列了,但是有很多问题经常在群里出现,所以这里再次整理一下. 需要注意的是,在下面的问题中,除了加上XML属性外,主窗口必须继承自WindowImpl ...
- director.js:客户端的路由---简明中文教程
1.引子 最近学用director.js,那是相当的简单易学易使用.不过开始学的时候,搜搜过后,却没有发现相关的中文教程.于是决定硬啃E文,翻译备用的同时也当是给自己上课并加深对它的理解. direc ...
随机推荐
- 小成就之解决调用spring中FileSystemXmlApplicationContext路径问题
此文写下调用spring过程中遇到的一个问题!或许对于入行的人一看觉得我很傻逼吧,这问题谁都会了!但我觉得对于新手(自已)来说,算是一个好思路与好办法! 问题: 对于 test_aa ta = (te ...
- php调用python脚本
主要参考两篇文章 PHP中的换行详解 利用PHP调试Python Python小窥 - 写给Python的入门者 这两篇文章结合起来进行测试,主要过程如下 cd /var/www/html mkdir ...
- Xamarin iOS教程之添加和定制视图
Xamarin iOS教程之添加和定制视图 Xamarin iOS用户界面——视图 在iPhone或者iPad中,用户看到的摸到的都是视图.视图是用户界面的重要组成元素.例如,想要让用户实现文本输入时 ...
- android 多线程的实现方式
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha. 1,通过创建线程池,来创建多个线程. 2,通过异步任务,来创建线程池,从而创建多线程. ...
- 编码自动识别工具 uchardet
本文转自网络 最近在给OpenCC做图形界面,遇到一个问题:OpenCC默认只能转换utf-8文本,其他编码像GB18030,BIG5只能转换成utf-8以后,才能用OpenCC转换.这个问题说大不大 ...
- BZOJ2468 : [中山市选2010]三核苷酸
令d[i]为第i个样本数据,cnt为样本个数,经过化简可得 \[ans=\frac{\sum(d[i]^2)}{cnt}-(\frac{\sum d[i]}{cnt})^2\] 枚举每一种可能的三核苷 ...
- 关于 TRegEx.Split()
表达式中的括号将严重影响分割结果. uses RegularExpressions; const FSourceText = '1: AAA 2: BBB 3: CCC'; // 分隔符将有三部分构成 ...
- 使用Docker中国官方镜像的加速地址
vi /etc/docker/daemon.json # 添加如下内容 { "registry-mirrors": ["https://registry.docker-c ...
- 使用p3p跨域设置Cookie
有些时候不能将url上的参数传来传去,比如与调用某开放平台上的接口,这时候可能需要借助Cookie来进行处理了,但这里可能又涉及到跨域的问题. 如果浏览器开启了对Cookie的支持,按照Cookie ...
- 【Go命令教程】11. go vet 与 go tool vet
命令 go vet 是一个 用于检查 Go 语言源码中静态错误的简单工具.与大多数 Go 命令一样,go vet 命令可以接受 -n 标记和 -x 标记.-n 标记用于只打印流程中执行的命令而不真正执 ...