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
是命令行标志johannes
和brahms
是命令行参数(arguments),它们不以破折号开头
基本使用
使用方法
参数解释
- 标志名称(如
big_menu
和languages
) - 默认值(如
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
解析命令行参数并将其与定义的标志进行绑定
argc
和argv
是命令行参数和参数数量remove_flags
指定是否将标志从argv
中移除。一般情况下,设置为true
,表示在解析后自动移除标志项
void gflags::ParseCommandLineFlags(int* argc, char*** argv, bool remove_flags);
FLAGS_ 访问标志*
每个使用 DEFINE_*
宏定义的标志,都可以通过 FLAGS_
前缀来访问。例如,FLAGS_verbose
、FLAGS_port
、FLAGS_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;
}