gflags命令行参数解析库使用探究
gflags库介绍
gflags是Google开发的一个开源库,用于C++应用程序中命令行参数的声明、定义和解析。gflags库提供了一种简单的方式来添加、解析和文档化命令行标志(flags),使得程序可以根据不同的运行时配置进行调整。
为什么用gflags
它有如下优点:
- 易于使用: 
flags提供了一套简单直观的API来定义和解析命令行标志,使得开发者可以轻松地为应用程序添加新的参数。 - 自动帮助和文档:
gflags可以自动生成每个标志的帮助信息和文档(内容由开发者填充),这有助于用户理解如何使用程序及其参数。 - 类型安全:
gflags支持多种数据类型的标志,包括布尔值、整数、字符串等,并且提供了类型检查和转换。 - 多平台支持:
gflags可以在多种操作系统上使用,包括Windows、Linux和macOS - 可扩展性:
gflags允许开发者自定义标志的注册和解析逻辑,提供了强大的扩展性。 
官方文档: https://gflags.github.io/gflags/
代码仓库: https://github.com/gflags/gflags.git 
gflags安装
目前只介绍Ubuntu环境下的安装
apt安装
1  | sudo apt update  | 
源码安装
1  | 下载源码  | 
gflags使用
目前用到的函数来自于下面的头文件
1  | 
编译时要添加 -lgflags 链接库
声明参数
gflags提供形如DEFINE_*来声明各种类型的命令行参数,其参数如下:
name: 参数名称,就和声明变量一样,不需要加引号val: 默认值,当不导入配置文件或者通过修改命令行参数时,所使用的默认值txt: 字符串,用于填写该参数的帮助信息返回值: 不关心
各种支持声明的类型
1  | DEFINE_bool  | 
访问参数
出于突出显示命令行参数的目的,同时也可以避免冲突,所有在DEFINE_*中声明的变量名(例如)name,在其作用域内都被统一加上了FLAGS_前缀,变成了FLAGS_name。
代码示例如下
1  | 
  | 
输出结果如下图:

不同文件访问参数
glfags库提供了DECLEAR_*系列函数来实现类似extern声明的功能,使之支持声明和实现分离,或者通过链接.o文件的方式访问其它源文件内的全局变量,例子如下
1  | //////////////////////////  | 
解析命令行参数
为了使FLAGS_*变量能够成功地被命令行参数赋值,需要在main函数中调用解析函数
1  | uint32 ParseCommandLineFlags(int *argc, char*** argv, bool remove_flags);  | 
arc和argc:main函数的入口参数的地址,传入时加个&即可remove_flagstrue: 会从argv中移除标识和它们的参数,相应减少argc的值。false:会保留argc 不变,但将会重新调整它们的顺序,使得标识再前面
命令行参数设置
gflags提供了多种在命令行中配置参数的方式,以编译获得的可执行程序cmd为例
string和int的设置方式1
2
3
4cmd --ip="0.0.0.0"
cmd -ip="0.0.0.0"
cmd --ip "0.0.0.0"
cmd -ip "0.0.0.0"bool的设置方式1
2
3
4cmd --debug_enable
cmd --nodebug_enable
cmd --debug_enable=true
cmd --debug_enable=false
配置文件设置
可以通过配置文件对参数设置进行文件持久化。配置文件的编写方式十分简单,形式就是-key=value的样子
使用方法则是在执行时添加参数--flagfile=filepath
示例文件 myconf.conf
1  | -ip=0.0.0.0  | 
输出结果如下

特殊参数标识
gflags默认提供了一些特殊的参数标识
1  | --help # 显示文件中所有标识的帮助信息  | 
代码示例
main.cpp
1  | 
  | 
myconf.conf
1  | -ip=0.0.0.0  | 
makefile
1  | cmd:main.cpp  | 
各种运行结果
默认

指定参数

指定配置文件

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 supdriver的博客!
 评论