参考博客;https://blog.csdn.net/lezardfu/article/details/23753741
gflags是google的一个开源的处理命令行参数的库,使用c++开发,具备python接口,可以替代getopt。gflags使用起来比getopt方便,但是不支持参数的简写(例如getopt支持–list缩写成-l,gflags不支持)。
gflags 源码下载地址: https://github.com/gflags/gflags
官方说明文档:https://gflags.github.io/gflags/
ubuntu下使用命令安装:
sudo apt-get install libgflags*
例如:fgrep -l -f /var/tmp/foo johannes brahms
“-l” 和 “-f /var/tmp/foo”是命令行标记;
“johannes” 和 “brahms”是命令行参数
注意:gflags只能处理命令行标记(Commandline flags ),不会处理命令行参数(commandline arguments)
头文件:#include <gflags/gflags.h>
支持的数据类型:
DEFINE_bool: boolean
DEFINE_int32: 32-bit integer
DEFINE_int64: 64-bit integer
DEFINE_uint64: unsigned 64-bit integer
DEFINE_double: double
DEFINE_string: C++ string
例如:
DEFINE_bool(quiet, true, “打印详细信息”);
DEFINE_string(infile, “”, “输入文件”);
格式说明:
DEFINE宏有三个参数:标志的名称、默认值以及描述其用法的字符串,当使用–help命令行标记时,会打印这些说明信息
使用“FLAGS_”前缀的宏,来访问命令行标记
例如:
//首先通过gflags来分析命令行标记
gflags::ParseCommandLineFlags(&argc, &argv, true);
if (FLAGS_quiet){
std::cout << "hello world" << std::endl;
std::cout << "fileName = " << FLAGS_infile << std::endl;;
}
//使用--version时,显示版本信息
void SetVersionString(const std::string& version);
//使用--help时,显示帮助信息,不用添加命令行标志的信息,命令行标志的信息在宏 DEFINE_ 中已经添加了
void SetUsageMessage(const std::string& usage)
//主动打印帮助信息
void ShowUsageWithFlags(const char *argv0);
//主动打印帮助信息,参数restrict表示显示哪个文件中使用宏 DEFINE_ 定义的命令行标记
void ShowUsageWithFlagsRestrict(const char *argv0, const char *restrict);
例如:在flagsV2.cpp中使用宏 DEFINE_ 定义了命令行标记,
1> 如果只打印flagsV2.cpp中定义的命令行标记,使用如下函数
gflags::ShowUsageWithFlagsRestrict(argv[0], "flagsV2");
打印信息:
$ ./flagsV2
flagsV2: 用法: flags <子命令> <参数>
子命令列表:
cmd1 这个是子命令
Flags from flagsV2.cpp:
-infile (输入文件) type: string default: ""
-quiet (打印详细信息) type: bool default: false
2> 如果要打印全部信息,包括gflags本身的一些命令行标记,使用如下函数
gflags::ShowUsageWithFlags(argv[0]);
//或者 gflags::ShowUsageWithFlagsRestrict(argv[0], "");
//只要restrict形参不是flagsV2(或者flagsV2的子串,如flag)
打印信息:
$ ./flagsV2t
flagsV2: 用法: flags <子命令> <参数>
子命令列表:
cmd1 这个是子命令
Flags from flagsV2.cpp:
-infile (输入文件) type: string default: ""
-quiet (打印详细信息) type: bool default: false
Flags from src/gflags.cc:
-flagfile (load flags from file) type: string default: ""
-fromenv (set flags from the environment [use 'export FLAGS_flag1=value'])
type: string default: ""
-tryfromenv (set flags from the environment if present) type: string
default: ""
-undefok (comma-separated list of flag names that it is okay to specify on
the command line even if the program does not define a flag with that
name. IMPORTANT: flags in this list that have arguments MUST use the
flag=value format) type: string default: ""
Flags from src/gflags_completions.cc:
-tab_completion_columns (Number of columns to use in output for tab
completion) type: int32 default: 80
-tab_completion_word (If non-empty, HandleCommandLineCompletions() will
hijack the process and attempt to do bash-style command line flag
completion on this value.) type: string default: ""
Flags from src/gflags_reporting.cc:
-help (show help on all flags [tip: all flags can have two dashes])
type: bool default: false
-helpfull (show help on all flags -- same as -help) type: bool
default: false
-helpmatch (show help on modules whose name contains the specified substr)
type: string default: ""
-helpon (show help on the modules named by this flag value) type: string
default: ""
-helppackage (show help on all modules in the main package) type: bool
default: false
-helpshort (show help on only the main module for this program) type: bool
default: false
-helpxml (produce an xml version of help) type: bool default: false
-version (show version and build info and exit) type: bool default: false
#include <gflags/gflags.h>
#include <iostream>
#ifndef GFLAGS_GFLAGS_H_
namespace gflags = google;
#endif // GFLAGS_GFLAGS_H_
DEFINE_bool(quiet, true, "打印详细信息");
DEFINE_string(infile, "", "输入文件");
int main(int argc, char** argv){
gflags::ParseCommandLineFlags(&argc, &argv, true);
if (FLAGS_quiet){
std::cout << "hello world" << std::endl;
std::cout << "fileName = " << FLAGS_infile << std::endl;;
}
}
编译时,需要链接gflags: -lgflags
g++ -o flagsV0 flagsV0.cpp -lgflags
原理是,利用gflags不会处理命令行参数,只处理命令行标记的特性
#include <gflags/gflags.h>
#include <iostream>
#ifndef GFLAGS_GFLAGS_H_
namespace gflags = google;
#endif // GFLAGS_GFLAGS_H_
DEFINE_bool(quiet, false, "打印详细信息");
DEFINE_string(infile, "", "输入文件");
int main(int argc, char** argv){
gflags::SetUsageMessage("用法: flags <子命令> <参数>\n\n"
"子命令列表:\n"
" cmd1 这个是子命令\n");
gflags::ParseCommandLineFlags(&argc, &argv, true);
if(argc!=2){
//gflags::ShowUsageWithFlagsRestrict(argv[0], "aaa");
gflags::ShowUsageWithFlagsRestrict(argv[0], "flagsV2");
//gflags::ShowUsageWithFlags(argv[0]);
return 0;
}
if (FLAGS_quiet){
std::cout << "hello world" << std::endl;
std::cout << "fileName = " << FLAGS_infile << std::endl;;
}
}