C++命令行解析包gflags的使用教程
什么是gflags?
gflags是Google开源的C++命令行解析包,可以方便的对C++程序进行命令行参数的解析,自动生成帮助信息等操作。使用gflags需要引入
gflags的基本用法
在C++程序中使用gflags的过程中,主要可以通过两个宏定义来添加命令行参数:
- DEFINE_xx: 定义一个命令行变量,并指定它的值。其中xx可以是string,int32,double, bool等类型。
- DECLARE_xx:声明一个命令行变量后,需要使用DECLARE_xx来告诉gflags应该如何解析该变量。
示例1:定义一个bool类型的命令行变量,并输出其值
#include <gflags/gflags.h>
#include <iostream>
DEFINE_bool(verbose, false, "verbose mode");
int main(int argc, char* argv[]) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
if(FLAGS_verbose) {
std::cout << "verbose mode is on" << std::endl;
} else {
std::cout << "verbose mode is off" << std::endl;
}
return 0;
}
注:若需要上述代码编译需要使用如下命令进行编译
g++ -o test test.cpp -lgflags
在上述代码中我们使用DEFINE_bool宏定义了一个bool类型的命令行变量verbose,并将其默认值设置为false。
然后使用gflags::ParseCommandLineFlags函数来解析命令行参数。如果用户在命令行中加上了--verbose选项,则FLAGS_verbose被设置为true,否则为false。
示例2:定义一个int32类型的命令行变量,并输出其值
#include <gflags/gflags.h>
#include <iostream>
DEFINE_int32(width, 640, "image width");
int main(int argc, char* argv[]) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
std::cout << "image width is " << FLAGS_width << std::endl;
return 0;
}
在上述代码中,我们使用DEFINE_int32宏定义了一个int32类型的命令行变量width,并将其默认值设置为640。
然后使用gflags::ParseCommandLineFlags函数来解析命令行参数。如果用户在命令行中加上了--width选项,则FLAGS_width被设置为用户指定的值,否则为默认值640。
gflags的高级用法
除了上述基本用法之外,gflags还提供了一些高级功能,比如多种参数值类型的支持和自动生成帮助信息等。
下面我们详细讲解gflags的高级用法。
支持多种参数值类型
除了基本类型,如bool, int32, double等,gflags还支持如下类型:
类型 | 说明 |
---|---|
string | 字符串类型 |
enum | 枚举类型 |
vector | 数组类型 |
string类型
string类型的命令行参数的定义和使用如下:
#include <gflags/gflags.h>
#include <iostream>
DEFINE_string(name, "world", "user name");
int main(int argc, char* argv[]) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
std::cout << "Hello, " << FLAGS_name << std::endl;
return 0;
}
在上述代码中,我们使用DEFINE_string宏定义了一个string类型的命令行变量name,并将其默认值设置为"world"。
然后使用gflags::ParseCommandLineFlags函数来解析命令行参数。如果用户在命令行中加上了--name选项,则FLAGS_name被设置为用户指定的字符串,否则为默认值"world"。
enum类型
enum类型的命令行参数的定义和使用如下:
#include <gflags/gflags.h>
#include <iostream>
#include <vector>
DECLARE_string(color);
enum Colors {
RED,
GREEN,
BLUE,
};
DEFINE_enum(color, RED, std::vector<std::string>{"RED", "GREEN", "BLUE"}, "color");
int main(int argc, char* argv[]) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
std::cout << "your selected color is " << FLAGS_color << std::endl;
// 使用FLAGS_color的枚举变量
switch (FLAGS_color) {
case RED:
std::cout << "color is red" << std::endl;
break;
case GREEN:
std::cout << "color is green" << std::endl;
break;
case BLUE:
std::cout << "color is blue" << std::endl;
break;
default:
std::cout << "undefined color" << std::endl;
}
return 0;
}
在上述代码中,我们使用DEFINE_enum宏定义了一个枚举类型的命令行变量color。其中,该变量的默认值为RED,选项值为"RED", "GREEN", "BLUE"。
然后使用gflags::ParseCommandLineFlags函数来解析命令行参数。如果用户在命令行中加上了--color选项,则
FLAGS_color被设置为用户指定的颜色对应的枚举变量,否则为默认值RED。
vector类型
vector类型的命令行参数的定义和使用如下:
#include <gflags/gflags.h>
#include <iostream>
#include <vector>
DEFINE_int32_vec(vec, std::vector<int>{1, 2, 3}, "int array");
int main(int argc, char* argv[]) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
std::cout << "int array size is " << FLAGS_vec.size() << std::endl;
std::cout << "int array elements are ";
for (int i = 0; i < FLAGS_vec.size(); i++) {
std::cout << FLAGS_vec[i] << " ";
}
std::cout << std::endl;
return 0;
}
在上述代码中,我们使用DEFINE_int32_vec宏定义了一个int数组类型的命令行变量vec,并将其默认值设置为{1,2,3}。
然后使用gflags::ParseCommandLineFlags函数来解析命令行参数。如果用户在命令行中加上了--vec选项,则
FLAGS_vec被设置为用户指定的整数数组,否则为默认值{1,2,3}。
自动生成帮助信息
gflags还可以自动生成命令行参数的帮助信息。
主要有两种方式来生成帮助信息:
- 使用gflags::SetUsageMessage来手动生成帮助信息。
- 使用gflags::InitGoogleLogging和gflags::HandleCommandLineHelp来自动生成帮助信息。
手动生成帮助信息
手动生成帮助信息的方法如下:
#include <gflags/gflags.h>
#include <iostream>
DEFINE_bool(verbose, false, "verbose mode");
int main(int argc, char* argv[]) {
gflags::SetUsageMessage("Usage: ./test [options]\n");
gflags::SetVersionString("version 0.1.0\n");
gflags::ParseCommandLineNonHelpFlags(&argc, &argv, true);
if(FLAGS_verbose) {
std::cout << "verbose mode is on" << std::endl;
} else {
std::cout << "verbose mode is off" << std::endl;
}
gflags::HandleCommandLineHelpFlags();
return 0;
}
在上述代码中,我们使用gflags::SetUsageMessage函数手动设置了命令行参数的帮助信息和版本号。
然后使用gflags::ParseCommandLineNonHelpFlags函数来解析除帮助信息和版本号之外的命令行参数。
然后根据用户输入的命令行参数来执行程序。最后使用gflags::HandleCommandLineHelpFlags函数来打印帮助信息。
自动生成帮助信息
自动生成帮助信息的方法如下:
#include <gflags/gflags.h>
#include <iostream>
#include <glog/logging.h>
DEFINE_bool(verbose, false, "verbose mode");
int main(int argc, char* argv[]) {
google::InitGoogleLogging(argv[0]);
gflags::SetVersionString("version 0.1.0\n");
gflags::ParseCommandLineFlags(&argc, &argv, true);
if(FLAGS_verbose) {
LOG(INFO) << "verbose mode is on";
} else {
LOG(INFO) << "verbose mode is off";
}
return 0;
}
在上述代码中,我们使用google::InitGoogleLogging和gflags::SetVersionString函数来设置版本号。
然后使用gflags::ParseCommandLineFlags函数来解析命令行参数,并自动生成帮助信息。
然后根据用户输入的命令行参数来执行程序。
最后
本文主要介绍了gflags的使用方法,包括基本用法和高级用法。希望大家可以通过学习此篇文章,对gflags有一个更深入的了解。
参考资料
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++命令行解析包gflags的使用教程 - Python技术站