gflags框架

How To Use Gflags (formerly Google Commandline Flags)(官方文档)

基本了解

gflags是一个简单的库,主要用于命令行参数解析,从而帮助管理执行程序的配置参数,在配置服务器的时候,可以不用修改端口和IP地址的时候对文件进行重新编译 

gflags方便使用,可以自动生成每个标志的帮助信息,同时支持多种数据类的类型,并且提供了类型检查和转换;其还支持多平台应用,具有良好的拓展性

支持的数据类型

  • DEFINE_bool:布尔值(true/false)。
  • DEFINE_int32:32位整数。
  • DEFINE_int64:64位整数。
  • DEFINE_uint64:无符号64位整数。
  • DEFINE_double:双精度浮点数。
  • DEFINE_string:C++字符串。

不同文件访问参数

 通过DEFINE_* 和 DECLARE_* 宏的机制,从而实现跨文件访问参数,详细的参考代码

// foo.cc
#include <gflags/gflags.h>

DEFINE_bool(verbose, false, "Enable verbose logging");
DEFINE_string(input_file, "input.txt", "Input file name");
// bar.cc
#include <gflags/gflags.h>

DECLARE_bool(verbose);  // 声明在 foo.cc 中定义的 `verbose` 标志
DECLARE_string(input_file);  // 声明在 foo.cc 中定义的 `input_file` 标志

 命令行标志

命令行标志是用户在运行可执行程序,通过命令行指定的参数 

fgrep -l -f /var/tmp/foo johannes brahms
  • -l-f /var/tmp/foo 是命令行标志
  • johannesbrahms 是命令行参数(arguments),它们不以破折号开头

基本使用 

使用方法

参数解释

  • 标志名称(如 big_menulanguages
  • 默认值(如 true"english,french,german"
  • 描述信息(描述标志的用途,当用户运行程序时可以通过 --help 查看)
#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");

基本操作:默认参数打印

#include <gflags/gflags.h>
#include <iostream>

DEFINE_string(ip,"127.0.0.1","服务器监听IP地址格式:127.0.0.1");
DEFINE_int32(port,8080,"服务器监听端口格式:8080");
DEFINE_bool(debug_enable,true,"启动调试模式:true/false");

int main(int argc , char *argv[])
{
    google::ParseCommandLineFlags(&argc,&argv,true);

    std::cout<<FLAGS_ip<<std::endl;
    std::cout<<FLAGS_port<<std::endl;
    std::cout<<FLAGS_debug_enable<<std::endl;

    return 0;
}

命令行运行时指定对应参数

配置文件指定对应参数

为了让程序的运行参数配置更加标准化,不需要每次运行的时候都手动传入参数的的数值,通过配置文件减少配置重复工作 

Reporting标志

  • --help: 显示所有标志及其默认值和描述
  • --helpshort: 类似于 --help,但显示较短的帮助信息
  • --helpmatch: 显示特定名称匹配的标志(模糊匹配)
  • --helpon: 仅显示与当前可执行文件关联的标志
  • --helpfull: 显示所有可用标志
  • --helpflags: 显示某个文件中定义的所有标志
  • --version: 显示可执行程序的版本信息

常用接口总结

EFINE_ 宏定义标志

  • DEFINE_bool(name, default_value, description):定义一个布尔类型标志。
  • DEFINE_int32(name, default_value, description):定义一个32位整数类型标志。
  • DEFINE_int64(name, default_value, description):定义一个64位整数类型标志。
  • DEFINE_double(name, default_value, description):定义一个浮动类型标志。
  • DEFINE_string(name, default_value, description):定义一个字符串类型标志。

#include <gflags/gflags.h>

DEFINE_bool(verbose, false, "Enable verbose output");
DEFINE_int32(port, 8080, "Port number");
DEFINE_string(config_file, "config.txt", "Path to the config file");

int main(int argc, char* argv[]) {
    // 解析命令行参数
    gflags::ParseCommandLineFlags(&argc, &argv, true);
    
    // 使用标志值
    if (FLAGS_verbose) {
        std::cout << "Verbose output enabled" << std::endl;
    }
    std::cout << "Port: " << FLAGS_port << std::endl;
    std::cout << "Config file: " << FLAGS_config_file << std::endl;

    return 0;
}

gflags::ParseCommandLineFlags

解析命令行参数并将其与定义的标志进行绑定

  • argcargv 是命令行参数和参数数量
  • remove_flags 指定是否将标志从 argv 中移除。一般情况下,设置为 true,表示在解析后自动移除标志项
void gflags::ParseCommandLineFlags(int* argc, char*** argv, bool remove_flags);

FLAGS_ 访问标志*

每个使用 DEFINE_* 宏定义的标志,都可以通过 FLAGS_ 前缀来访问。例如,FLAGS_verboseFLAGS_portFLAGS_config_file

if (FLAGS_verbose) {
    std::cout << "Verbose output enabled" << std::endl;
}
std::cout << "Port: " << FLAGS_port << std::endl;
std::cout << "Config file: " << FLAGS_config_file << std::endl;

gflags::ShowUsageWithFlags

显示程序的帮助信息,包括所有已定义的标志及其说明;program 是程序的名称,用于显示帮助信息

void gflags::ShowUsageWithFlags(const char* program);


int main(int argc, char* argv[]) {
    if (argc == 1) {  // 如果没有参数,显示帮助信息
        gflags::ShowUsageWithFlags(argv[0]);
        return 0;
    }
    
    gflags::ParseCommandLineFlags(&argc, &argv, true);
    // 继续程序逻辑
}

gflags::UnparseCommandLineFlags

获取命令行参数的字符串表示,通常用于日志记录或调试

std::string gflags::UnparseCommandLineFlags();

int main(int argc, char* argv[]) {
    gflags::ParseCommandLineFlags(&argc, &argv, true);
    
    std::cout << "Command line flags: " << gflags::UnparseCommandLineFlags() << std::endl;
    return 0;
}

gflags::GetCommandLineFlagInfo

用来获取某个标志的详细信息,包括标志的类型、描述、默认值等;name - 标志的名称;flag_info:返回的标志信息

bool gflags::GetCommandLineFlagInfo(const std::string& name, CommandLineFlagInfo* flag_info);
gflags::CommandLineFlagInfo flag_info;
if (gflags::GetCommandLineFlagInfo("port", &flag_info)) {
    std::cout << "Port flag info: " << flag_info.description() << std::endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值