gFlags-使用指南

最近看到的一个示例代码中有使用gflags,就去简单查了一下资料学习一下。

参考资料:

gitHub
官方使用文档
Gflags简明教程 http://dreamrunner.org/blog/2014/03/09/gflags-jian-ming-shi-yong/
GFlags使用文档 http://www.yeolar.com/note/2014/12/14/gflags/

简介

GFlags是Google开源的一套命令行参数处理的开源库,包括C++的版本和python 版本。
和 getopt() 之类的库不同,flag的定义可以散布在各个源码中,而不用放在一起。一个源码文件可以定义一些它自己的flag,链接了该文件的应用都能使用这些flag。这样就能非常方便地复用代码。如果不同的文件定义了相同的flag,链接时会报错。

在程序中定义Flags

定义一个flag是简单的:只需要使用你想用的类型的相应的宏就可以。
example:

// foo.cc
#include <gflags/glags.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");

支持的类型:

  • 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宏包含三个参数:flag名、默认值、描述方法的帮助。帮助会在执行 –help flag时显示。
    可以在任何源文件中定义flag,但是每个只能定义一次。如果需要在多处使用,那么在一个文件中 DEFINE ,在其他文件中 DECLARE 。比较好的方法是在 .cc 文件中 DEFINE ,在 .h 文件中 DECLARE ,这样包含头文件即可使用flag了。

使用flag

定义的flag可以像正常的变量一样使用,只需在前面加上 FLAGS_前缀。如前面例子中的定义了 FLAGS_big_menuFLAGS_languages两个变量。可以像一般变量一样读写:

if (FLAGS_consider_made_up_languages)
  FLAGS_languages += ",klingon";   // implied by --consider_made_up_languages
if (FLAGS_languages.find("finnish") != string::npos)
  HandleFinnish();

初始化所有参数

定义好参数后,最后要告诉执行程序去处理命令行传入的参数,使得定义的FLAG参数得到正确赋值。
通常是在main()函数中调用

google::ParseCommandLineFlags(&argc, &argv, true);

argcargv就是 main 的入口参数,因为这个函数会改变他们的值,所以都是以指针传入。
第三个参数被称为remove_flags。如果它是trueParseCommandLineFlags会从argv中移除标识和它们的参数,相应减少argc的值。然后argv 只保留命令行参数。
相反,remove_flagsfalseParseCommandLineFlags会保留argc不变,但将会重新调整它们的顺序,使得标识再前面。
Note: ./foo --big_menu=false arg1中再big_menu是标识,false是它的参数,arg1是命令行参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值