当前位置: 首页 > article >正文

[C++][第三方库][gflags]详细讲解

目录

  • 1.介绍
  • 2.安装
  • 3.使用
    • 1.包含头文件
    • 2.定义参数
    • 3.访问参数
    • 4.不同文件访问参数
    • 5.初始化所有参数
    • 6.运行参数设置
    • 7.配置文件的使用
    • 8.特殊参数标识
  • 4.入门示例
    • 1.命令行键入参数
    • 2.配置文件导入


1.介绍

  • gflags是Google开发的一个开源库,用于C++应用程序中命令行参数的声明、定义和解析
  • gflags库提供了一种简单的方式来添加、解析和文档化命令行标志(flags),使得程序可以根据不同的配置进行调整
  • 特点
    • 易于使用gflags提供了一套简单直观的API来定义和解析命令行标志,使得开发者可以轻松地为应用程序添加新的参数
    • 自动帮助和文档gflags可以自动生成每个标志的帮助信息和文档,这有助于用户理解和如何使用程序及其参数
    • 类型安全gflags支持多种数据类型的标识,包括布尔值、整数、字符串等,并且提供了类型检查和转换
    • 多平台支持gflags可以在多种OS上使用,包括Windows、Linux和MacOS
    • 可拓展性gflags允许开发者自定义标志的注册和解析逻辑,提供了强大的拓展性
  • 官方文档
  • 代码仓库

2.安装

  • 直接命令安装sudo apt install libgflags-dev
  • 源码安装clone后,使用cmake安装即可,详细可参照官方文档

3.使用

1.包含头文件

  • 使用gflags库来定义/解析命令行参数必须包含如下头文件:
    #include <gflags/gflags.h>
    

2.定义参数

  • 利用gflags提供的宏定义来定义参数,该宏的三个参数分别为命令行参数名、参数默认值、参数的帮助信息
  • gflags支持定义多种类型的宏函数
    DEFINE_bool
    DEFINE_int32
    DEFINE_int64
    DEFINE_uint64
    DEFINE_double
    DEFINE_string
    
  • 示例
    DEFINE_bool(debug, true, “是否开启调试”);
    DEFINE_int32(log_level, 1,1-DEBUG, 2-WARN, 3-ERROR);
    DEFINE_string(log_file,stdout, ”日志输出位置, 默认为标准输出”);
    

3.访问参数

  • 可以在程序中通过FLAGS_name像正常变量一样访问标志参数
    • 例如:可以通过FLAGS_debug, FLAGS_log_level变量来访问命令行参数

4.不同文件访问参数

  • 如果想在另外一个文件访问当前文件的参数,以参数FLAGS_debug为例,可以使用宏DECLARE_bool(debug)来声明引入这个参数
  • 这个宏相当于做了external FLAGS_debug;,定义外部链接属性

5.初始化所有参数

  • 当定义好参数后,需要告诉可执行程序去处理解析命令行传入的参数,使得FLAGS_*变量能得到正确赋值
  • 需要在main函数中,调用下面的函数来解析命令行传入的所有参数
    google::ParseCommandLineFlags(&argc, &argv, true);
    
  • 说明
    • argcargvmain的入口参数
    • 第三个参数被称为remove_flags
      • 如果为true,则表示ParseCommandLineFlags会从argv中移除标识和它们的参数,相应减少argc的值
      • 如果为false,则表示ParseCommandLineFlags会保留argc不变,但将会重新调整他们的顺序,使得标识在前面

6.运行参数设置

  • gflags提供了多种命令行设置参数的方式
  • stringint设置参数
    exec —-log_file=“./log”
    exec -log_file=“./log”
    exec —-log_file “./log”
    exec -log_file “./log”
    
  • bool设置参数
    exec --reuse_addr 
    exec --noreuse_addr 
    exec --reuse_addr=true 
    exec --reuse_addr=false
    
  • 说明--将会终止标识的处理
    • 例如exec -f1 1 -- -f2 2中,f1被认为是一个标识,但f2不会

7.配置文件的使用

  • 配置文件的使用,其实就是为了让程序的运行参数配置更加标准化,不需要每次运行的时候都手动收入每个参数的数值,而是通过配置文件,一次编写,永久使用
  • 注意
    • 配置文件中选项名称必须与代码中定义的选项名称一致
    • 配置文件中,标识前面只有一个-
  • 示例
    -reuse_addr=true
    -log_level=3
    -log_file=./log/main.log
    
  • 使用:启动可执行程序时,带上参数--flagfile=CONFIG_FILE

8.特殊参数标识

  • gflags也默认提供了几个特殊的标识
    • --help:显示文件中所有标识的帮助信息
    • --helpfull:和-help一样,帮助信息更全面一些
    • --helpshort:只显示当前执行文件里的标志
    • --helpxml:以xml方式打印,方便处理
    • --version:打印版本信息,由google::SetVersionString()设定
    • --flagfile -flagfile=f:从文件f中读取命令行参数

4.入门示例

1.命令行键入参数

  • main.cc
    #include <iostream>
    #include <gflags/gflags.h>
    
    DEFINE_bool(debug, true, "是否开启DEBUG模式, 格式:true/false");
    DEFINE_string(ip, "127.0.0.1", "服务器监听IP, 格式: 127.0.0.1");
    DEFINE_int32(port, 3366, "服务器监听端口, 格式: 3366");
    
    int main(int argc, char *argv[])
    {
        google::ParseCommandLineFlags(&argc, &argv, true);
        std::cout << FLAGS_debug << std::endl;
        std::cout << FLAGS_ip << std::endl;
        std::cout << FLAGS_port << std::endl;
    
        return 0;
    }
    
  • makefile
    main:main.cc
    	g++ -o $@ $^ -std=c++17 -lgflags
    
    .PHONY:clean
    clean:
    	rm main
    
  • 运行示例
    • 默认情况
      $ ./main 
      1
      127.0.0.1
      3366
      
    • 从命令行键入参数
      $ ./main --debug=false --ip="www.baidu.com" --port=8899
      0
      www.baidu.com
      8899
      

2.配置文件导入

  • main.conf
    -debug=true
    -ip="www.baidu.com"
    -port=6633
    
  • 运行示例
    $ ./main -flagfile=./main.conf
    1
    "www.baidu.com"
    6633
    

http://www.kler.cn/news/330145.html

相关文章:

  • Vue项目开发注意事项
  • Ubuntu22.04之测试本机网口速度(二百七十二)
  • PySpark把一列数据上下移动,时序数据
  • 【趣学Python算法100例】三色球
  • 认知杂谈94《菜鸟的自我修炼:创业的那些事》
  • 两数相加leetcode
  • 样式重置 normalize.css
  • 【零基础入门产品经理】学习准备篇 | 需要学一些什么呢?
  • 死锁的成因与解决方案
  • 景联文科技入选《2024中国AI大模型产业图谱2.0版》数据集代表厂商
  • Vue3.0面试题汇总
  • 如何实现一个Mini Spring Boot
  • Leecode热题100-283.移动零
  • AI学习指南深度学习篇-权重正则化的实现机制
  • 技术成神之路:设计模式(十八)适配器模式
  • 深度学习中的优化方法(Momentum,AdaGrad,RMSProp,Adam)详解及调用
  • 后台管理系统脚手架
  • ICM20948 DMP代码详解(58)
  • 深入探索 Pygwalker:Python 数据可视化的强大工具
  • STM32-MPU6050+DAM库源码(江协笔记)
  • Ps:打开与置入
  • C++——函数功能是:将两个两位数的正整数a、b合并成一个整数c,合并规则是将a的十位和个位分别放在c的千位和个位,将b的十位和个位分别放在c的十位和百位。
  • 小论树形dp
  • 游戏如何对抗改包
  • 【JavaScript】JIT
  • 【gradio】gradio构建webui demo时只支持一个访问?
  • [BCSP-X2024.小高3] 学习计划
  • 网络编程套接字TCP
  • DNS与ICMP
  • 毕业设计选题:基于ssm+vue+uniapp的校园水电费管理小程序