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_flags
true
: 会从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的博客!
评论