Gflags 简明使用

Stella981
• 阅读 553

简介

Google 的 gflags 是一套命令行参数处理的开源库。比 getopt 更方便,更功能强大,从 C++的库更好的支持 C++(如 C++的 string 类型)。

example 源代码先看 example 源代码,然后逐步介绍。

example.cc

1
2
3
4
5 6 7 8 9 10 11 12 13 14 15 16 17 18 

#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 0; } 

运行程序

  • 直接运行

run

1
2
3
4


  ➜  bin  ./sample
  argc=1
 big menu is ture  languages=english,french,german 
  • help 命令

run

1
2
3
4
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 

  ➜  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" 

在程序里定义参数

### 包含头文件

header_file

1


 #include <gflags/gflags.h> 

利用 gflag 提供的宏定义参数该宏的 3 个参数分别为命令行参数名,参数默认值,参数的帮助信息。

define_flags

1
2


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 暂时支持如下参数的类型:

supported_types

1
2
3
4
5 6 

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 

访问参数

通过 FLAGS_name 像正常变量一样访问标志参数。在这个程序中,通过 FLAGS_big_menuFLAGS_languages访问它们。

不同文件访问参数

如果想再另外一个不是定义这个参数的文件访问这个参数的话,以参数 FLAGS_big_menu为例,用宏DECLARE_bool(big_menu)来声明引入这个参数。这个宏相当于做了extern FLAGS_big_menu.

整合一起,初始化所有参数

定义号参数后,最后要告诉执行程序去处理命令行传入的参数,使得 FLAGS_*参数们得到正确赋值。

通常就是再main()函数中调用;

set_up_flag

1


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

argcargv就是 main 的入口参数,因为这个函数会改变他们的值,所以都是以指针传入。

第三个参数被称为remove_flags。如果它是true,ParseCommandLineFlags会从argv中移除标识和它们的参数,相应减少argc的值。然后 argv 只保留命令行参数。

相反,remove_flagsfalse,ParseCommandLineFlags会保留argc不变,但将会重新调整它们的顺序,使得标识再前面。

Note: ./sample --big_menu=false arg1中再big_menu是标识,false是它的参数,arg1是命令行参数。

命令行设置参数

gflags 提供多种命令行设置参数。

stringint之类,可以用如下方式:

set_languages

1
2
3
4


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的标识来说,用如下方式:

set_boolean

1
2
3
4


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不会。

特殊标识

special_flags

1
2
3
4
5 6 7 

--help  显示文件中所有标识的完整帮助信息
--helpfull  和-help 一样,
--helpshort  只显示当前执行文件里的标志
--helpxml  以 xml 凡是打印,方便处理
--version 打印版本信息,由 google::SetVersionString()设定 --flagfile -flagfile=f 从文件 f 中读取命令行参数 ... 

具体见:http://gflags.googlecode.com/svn/trunk/doc/gflags.html

点赞
收藏
评论区
推荐文章
Karen110 Karen110
2年前
一文带你读懂PyQt:用Python做出与C++一样的GUI界面应用程序
\一、简介Python标准库更多的适合处理后台任务,唯一的图形库tkinter使用起来很不方便,所以后来出现了针对Python图形界面开发的扩展库,今天老猿要介绍的是主流Python图形界面扩展库之一的PyQt。在介绍PyQt之前,必须先简单介绍一下Qt。Qt是一个C可视化开发平台,是一个跨平台的C图形用户界面应用程序框架(CGUI)
cpp加油站 cpp加油站
2年前
【STL源码拆解】基于源码分析forward_lsit容器实现(详细!)
本篇文章介绍一下c11中新增的顺序容器forwardlist,基于stl的源码分析一下该容器的整体实现及数据结构。说明一下,我用的是gcc7.1.0编译器,标准库源代码也是这个版本的。按照惯例,还是先看一下本文大纲,如下:1.forwardlist是什么forwardlist是c11为STL新增加的一种顺序容器,使用的时候包含头文件forwar
Wesley13 Wesley13
2年前
.net程序反编译工具(ILSpy)
ILSpy是SharpDevelop小组的反编译工具,ILSPY这个开源工具的目的就是代替reflector的,它可以反编译出比reflector更好的C代码。PC官方版!(https://oscimg.oschina.net/oscnet/b35fba9fc6ada998d12775b18290c2348dc.png)C反编译工具ilsp
Stella981 Stella981
2年前
Nosqli:一款功能强大的NoSql注入命令行接口工具 (Go语言开发)
!(https://oscimg.oschina.net/oscnet/up89e2982410f9a35fdc07c20658df1190e26.JPEG)NosqliNosqli是一款功能强大的NoSql注入命令行接口工具,本质上来说,它就是一款NoSQL扫描和注入工具。Nosqli基于Go语言开发,是一款易于使用的NoSql
Stella981 Stella981
2年前
Beyond Comparer如何合并网页代码
BeyondCompare是一款智能化的文件管理工具,支持快速准确地比较、合并代码文件,是一款适合广大程序员朋友们使用的最佳编程辅助软件,其中在文本合并会话中,软件支持合并多种类型的源代码文件,主要包括:C,C,C,ObjC源代码;COBOL源代码;Delphi表单;HTML;Java源代码;VisualBasic源代码等等,接下来本文主要和大家讲
Stella981 Stella981
2年前
Osip2和eXosip协议栈的简析
Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高。eXosip是Osip2的一个扩展协议集,它部分封装了Osip2协议栈,使得它更容易被使用。一、介绍Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特
Stella981 Stella981
2年前
Redis5版本集群搭建
一、简介1.1Redis是什么Redis是一个开源的,使用ANSIC编写,高性能的KeyValue的NoSQL数据库。1.2Redis特点(1)基于内存(2)可持久化数据(3)具有丰富的数据结构类型,适应非关系型数据的存储需求(4)支持绝大多数主流开发语言,如C
Wesley13 Wesley13
2年前
mysql实践一:SQL基础
mysql简介mysql是有名的开放源代码关系型数据库。它最早是AB公司开源的,后来到Sun公司手中。之后Sun公司被Oracle公司收购,mysql就归Oracle所有。从此mysql走向商业化,又有名为mariadb数据库作为mysql的分支被开源,之后mysql又出了社区版和企业版。mysql大致的历史就这样,更详细的可以百度,这里
Stella981 Stella981
2年前
MinGW安装和使用
MinGW全称MinimalistGNUForWindows,是个精简的Windows平台C/C、ADA及Fortran编译器,相比Cygwin而言,体积要小很多,使用较为方便。MinGW提供了一套完整的开源编译工具集,以适合Windows平台应用开发,且不依赖任何第三方C运行时库。MinGW包括:一套集成编译器,包括C、C、A
Wesley13 Wesley13
2年前
6.MySQL简介
MySQL简介·点击查看MySQL官方网站·MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于facle旗下产品特点·使用C和C编写,并使用了多种编译器进行测试,保证源代码的可移植性·支持多种操作系统,如Linu