首页/新闻资讯/正文详情

gflags-命令行参数库超详细使用教程

发布时间:2026/9/26 0:50:54 来源:云帆数科 栏目:资讯中心
gflags-命令行参数库超详细使用教程
一、gflags是什么gflags是Google开源的一个C库专门用来处理命令行参数的声明、定义和解析。简单来说就是帮你管理程序启动时的那些配置参数的。它有这么几个厉害的特点简单好用一套宏定义直接搞定API非常直观自动生成帮助文档不用自己写–help的输出gflags自动帮你生成类型安全支持bool、int、string等多种类型自带类型检查跨平台Windows、Linux、macOS都能用扩展性强可以自定义注册和解析逻辑官方文档https://gflags.github.io/gflags/代码仓库https://github.com/gflags/gflags.git二、gflags安装方法一命令一键安装Ubuntu下一条命令搞定sudoapt-getinstalllibgflags-dev方法二源码安装追求最新版# 下载源码gitclone https://github.com/gflags/gflags.git# 切换目录cdgflags/mkdirbuildcdbuild/# 生成Makefilecmake..# 编译代码make# 安装sudomakeinstall此方法比较复杂也比较古老新手建议方法一哦安装完成后你会在系统里看到libgflags.a静态库和gflags.h等头文件就说明安装成功啦三、gflags基础使用1. 包含头文件使用gflags必须包含这个头文件记住了#includegflags/gflags.h编译的时候别忘了链接库g main.cc-omain-lgflags2. 定义命令行参数gflags用宏来定义参数三个参数分别是参数名、默认值、帮助说明。// 布尔类型参数DEFINE_bool(reuse_addr,true,是否开启网络地址重用选项);// 32位整数参数DEFINE_int32(log_level,1,日志等级:1-DEBUG, 2-WARN, 3-ERROR);// 字符串参数DEFINE_string(log_file,stdout,日志输出位置设置默认为标准输出);gflags支持的参数类型宏有这6种DEFINE_bool—— 布尔类型DEFINE_int32—— 32位整数DEFINE_int64—— 64位整数DEFINE_uint64—— 64位无符号整数DEFINE_double—— 浮点数DEFINE_string—— 字符串3. 访问参数定义好之后怎么用呢直接通过FLAGS_参数名就能像普通变量一样访问也就是在定义的参数前面直接加一个FLAGS_比如上面定义的reuse_addr就用FLAGS_reuse_addr来访问是不是很简单std::coutFLAGS_log_levelstd::endl;// 输出日志等级std::coutFLAGS_log_filestd::endl;// 输出日志文件路径4. 初始化解析参数光定义还不行得告诉程序去解析命令行传进来的参数。在main函数开头调用这个函数intmain(intargc,char*argv[]){google::ParseCommandLineFlags(argc,argv,true);// 后面就可以正常使用FLAGS_xxx了return0;}这里来拆分理解一下三个参数argc和argv就是main函数入口的那俩参数第三个参数叫remove_flags为true时解析完会把识别到的flag参数从argv里删掉argc也对应减少解析前argc5argv [./server, --port8080, --log_filelog.txt, test1, test2]remove_flagstrue 解析后argc3argv [./server, test1, test2]所有配置 flag 全部清除只剩业务参数 test1 test2。为false时保留所有参数但会调整顺序把flag参数放前面同样上面命令解析后argc 仍 5argv [./server, --port8080, --log_filelog.txt, test1, test2]只是不管输入顺序多乱flag 都会全部前置。四、gflags进阶玩法1. 跨文件访问参数如果参数定义在a.cc里我在b.cc想用怎么办用DECLARE宏声明一下就行// 在b.cc中声明引入a.cc里定义的reuse_addr参数DECLARE_bool(reuse_addr);其实这个宏本质就是做了个extern声明赋予外部链接属性跟我们平时写的extern变量一个道理~2. 命令行传参的多种姿势gflags支持好几种传参写法都能用看你习惯哪种string和int类型./main--log_file./main.log./main-log_file./main.log./main--log_file./main.log./main-log_file./main.log等号或者空格分隔都行单横杠双横杠也行非常灵活。bool类型./main--reuse_addr# 设为true./main--noreuse_addr# 设为false前面加no./main--reuse_addrtrue# 显式设为true./main--reuse_addrfalse# 显式设为false还有个小知识点遇到--就会停止参数解析。比如./main -f1 1 -- -f2 2只有f1被识别f2不算。3. 配置文件方式传参参数多了每次手敲太麻烦可以写进配置文件里配置文件main.conf长这样-reuse_addrtrue -log_level3 -log_file./log/main.log⚠️ 注意配置文件里字符串不用加双引号参数名要和代码里定义的一致运行的时候指定配置文件./main--flagfilemain.conf一键加载所有配置非常方便4. 自带的特殊参数gflags还贴心地给我们内置了几个实用参数--help# 显示所有标志的帮助信息--helpfull# 帮助信息更全面--helpshort# 只显示当前文件里的标志--helpxml# 以xml格式输出方便程序处理--version# 打印版本信息需要用SetVersionString设置--flagfilef# 从文件f读取参数直接./main --helpshort就能看到你定义的所有参数和说明再也不用手动写帮助文档啦五、完整入门案例光说不练假把式我们来写一个完整的小例子跑一跑。目录结构|-- main.cc |-- main.conf -- makefile配置文件 main.conf-reuse_addrtrue -log_level3 -log_file./log/main.log代码 main.cc#includegflags/gflags.h#includeiostream// 定义三个命令行参数DEFINE_bool(reuse_addr,true,是否开启网络地址重用选项);DEFINE_int32(log_level,1,日志等级:1-DEBUG, 2-WARN, 3-ERROR);DEFINE_string(log_file,stdout,日志输出位置设置默认为标准输出);intmain(intargc,char*argv[]){// 解析命令行参数google::ParseCommandLineFlags(argc,argv,true);// 打印参数值std::coutreuse: FLAGS_reuse_addrstd::endl;std::coutlevel: FLAGS_log_levelstd::endl;std::coutfile: FLAGS_log_filestd::endl;return0;}Makefilemain : main.cc g -stdc17 $^ -o $ -lgflags运行效果1. 查看帮助信息$ ./main-helpshortFlags from main.cc: log_file(日志输出位置设置默认为标准输出)type: string default:stdoutlog_level(日志等级:1-DEBUG,2-WARN,3-ERROR)type: int32 default:1reuse_addr(是否开启网络地址重用选项)type: bool default:true2. 默认运行使用默认值$ ./main reuse:1level:1file: stdout3. 通过配置文件运行$ ./main-flagfile./main.conf reuse:1level:3file: ./log/main.log4. 命令行直接传参$ ./main--noreuse_addr--log_level2--log_file./log reuse:0level:2file: ./log完美运行所有参数都正确解析了。总结gflags这个库用起来是不是超级方便总结一下核心步骤#include gflags/gflags.h包含头文件用DEFINE_xxx宏定义参数main里调用google::ParseCommandLineFlags解析通过FLAGS_xxx直接使用还有配置文件、跨文件声明、自动帮助文档这些实用功能日常开发完全够用了。以后写C程序需要传参数再也不用手写解析逻辑啦~是不是看的头都大了哈哈没事多敲两遍代码就熟了创作不易记得这次一定三连哈哈

相关推荐

多维聚合后的数据操纵:从立方体思维到工程化实践
多维聚合后的数据操纵:从立方体思维到工程化实践

1. 项目概述:这不是简单的“分组求和”,而是多维数据空间的精准导航 你有没有遇到过这样的场景:销售报表里要同时按“地区产品线季度”三个维度看销售额,还要在每个交叉格子里显示同比变化率、环比变化率、占区域总销售额比重、以… · 2026/9/20 10:24:33

拆解iPhone16 Pro Max:18层HDI主板,谁在造?
拆解iPhone16 Pro Max:18层HDI主板,谁在造?

关键词:iPhone16 Pro Max、18层HDI、PCB制造、高密度互连、PCB厂家一块主板引发的制造之问当我们将iPhone 16 Pro Max的机身拆解,内部值得关注的并非某一颗芯片,而是那块承载所有核心元件的主板。这块面积有限的电路板采用了18层HDI&#xff… · 2026/9/18 12:02:19

Unity2020安卓打包环境配置全攻略:JDK/SDK/NDK版本匹配与避坑指南
Unity2020安卓打包环境配置全攻略:JDK/SDK/NDK版本匹配与避坑指南

1. 项目概述:为什么Unity安卓打包总在环境配置上“翻车”? 如果你是一名Unity开发者,尤其是从PC或iOS平台转向安卓开发,大概率在第一次尝试打包APK时,会一头撞上“环境配置”这堵墙。Unity2020作为一个长期支持版本&am… · 2026/8/10 1:41:50

为什么它只占10MB内存?WSL Dashboard静默启动、系统托盘集成与开机自启配置详解
为什么它只占10MB内存?WSL Dashboard静默启动、系统托盘集成与开机自启配置详解

为什么它只占10MB内存?WSL Dashboard静默启动、系统托盘集成与开机自启配置详解 【免费下载链接】wsl-dashboard A GUI manager for WSL featuring a modern UI — a lightweight, low‑memory, high‑performance dashboard to manage WSL instances. Install, lis… · 2026/9/26 0:50:17

Windows 10 安装 Docker Desktop 全流程与 WSL 2 排查指南
Windows 10 安装 Docker Desktop 全流程与 WSL 2 排查指南

1. 为什么在 Windows 10 上装 Docker Desktop 不是“点下一步就完事”?——从真实踩坑现场说起 你搜“Windows 10 安装 Docker Desktop 教程”,页面刷出来几十篇,标题都差不多,点进去一看:下载安装包 → 双击运行 → … · 2026/9/26 0:48:44

深入KillerPDF.Engine源码:完整图解PDF解析器、交叉引用表与有界解析的实现原理
深入KillerPDF.Engine源码:完整图解PDF解析器、交叉引用表与有界解析的实现原理

深入KillerPDF.Engine源码:完整图解PDF解析器、交叉引用表与有界解析的实现原理 【免费下载链接】KillerPDF Free and open-source PDF editor for Windows with a built-in PDF 2.0 engine. View, annotate, OCR, merge, split, crop, rotate, compare, edit text,… · 2026/9/26 0:45:32

磁轴键盘的硬件秘密:Keychron-Keyboards-Hardware-Design 中 Q HE 与 K HE 磁轴结构设计的深度解读
磁轴键盘的硬件秘密:Keychron-Keyboards-Hardware-Design 中 Q HE 与 K HE 磁轴结构设计的深度解读

磁轴键盘的硬件秘密:Keychron-Keyboards-Hardware-Design 中 Q HE 与 K HE 磁轴结构设计的深度解读 【免费下载链接】Keychron-Keyboards-Hardware-Design Industrial design files for Keychron keyboards and mice. 100 models with CAD assets in STEP, DXF, DWG… · 2026/9/26 0:43:28

大数运算课程设计全解析:从数组存储到快速幂与进制转换
大数运算课程设计全解析:从数组存储到快速幂与进制转换

简介:一份用于数据结构课程设计的大数运算完整工程,面向高校学生、算法初学者以及需要完成同类课题的开发者。资源以 C 实现为主,同时支持十进制与二进制大数的加法、减法、乘法、除法、乘方、取模六类运算,包含快速幂、长除法、逐… · 2026/9/26 0:43:16

答辩PPT模板实战:从母版到放映的完整避坑指南
答辩PPT模板实战:从母版到放映的完整避坑指南

简介:为华中科技大学毕业生设计的毕业论文答辩PPT模板,聚焦论文答辩演示场景,内置研究背景及意义、研究目的及意义、研究思路及方法、研究结果与应用、相关建议和结论、参考文献、目录等答辩通用模块,整套叙事路径完整&#xff0c… · 2026/9/26 0:43:09

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码