命令行参数解析,一直是我们后段开发人员需要经常使用的一个功能,用来从终端解析接口的输入 ,并做出对应的处理。这里为使用C++/python的开发人员推荐一个便捷的命令行解析接口集 gflags。
我们之前使用C的getopt/getopt_long 函数需要自己使用其接口并编写大量的周边代码达到解析参数的目的,如果转到C++还使用上面的函数,代码会过于冗余。那么gflags就很好的解决了这个问题,我们不需要再数着冒号 "a️cd:"添加参数了,不需要为每个传入的参数做类型转化。
接下来的gflags 测试代码可以提前向下看一看,耳目一新,清晰明了。
详情可以参考:
install gflags
$ tar xzf gflags-$version-source.tar.gz
$ cd gflags-$version
$ mkdir build && cd build
$ ccmake ..
- Press 'c' to configure the build system and 'e' to ignore warnings.
- Set CMAKE_INSTALL_PREFIX and other CMake variables and options.
- Continue pressing 'c' until the option 'g' is available.
- Then press 'g' to generate the configuration files for GNU Make.
$ make
$ make test (optional)
$ make install (optional)
以上如果不进行对应的编译参数设置,默认头文件和动态库是安装在/usr/local/include/gflags
以及 /usr/local/lib
之中
主要使用如下几个接口进行参数相关的操作。
DEFINE_uint32
这样的接口定义我们的参数类型,参数名称,参数默认值SetVersionString(const std::string& version)
自己设置程序版本,主要是在用gflags编译的文件的命令行输入–version 输出版本信息void SetUsageMessage(const std::string& usage)
自己设置运行 --help时的帮助信息,默认会打印gflags相关的帮助信息uint32 ParseCommandLineFlags(int *argc, char*** argv, bool remove_flags)
解析传入的参数void ShutDownCommandLineFlags()
释放解析参数过程中分配的空间编写如下测试代码:
#include <gflags/gflags.h>
#include <iostream>
#include <string>
using namespace std;
using namespace google;
// default argvs from command line
DEFINE_int64(count,100,"count of nums");
DEFINE_string(entry,"str_string","the first of string");
DEFINE_bool(judge, false, "judge something");
string g_version;
string g_help;
string get_version() {
g_version = "1.3";
return g_version;
}
string get_help_info() {
g_help = "help info messages";
return g_help;
}
int main(int argc, char *argv[]) {
// Sets the version string
SetVersionString(get_version());
SetUsageMessage(get_help_info());
// Looks for flags in argv and parses them.
ParseCommandLineFlags(&argc,&argv, true);
cout << "count = " << FLAGS_count << endl;
cout << "entry = " << FLAGS_entry << endl;
if (FLAGS_judge) {
cout << "judge is true !" << endl;
} else {
cout << "judge is false !" << endl;
}
// Clean up memory allocated by flags.
ShutDownCommandLineFlags();
return 0;
}
编译:
g++ -std=c++11 gflags_test.cc -o gflags_test -lgflags
这个编译适用于gflags安装在默认路径下,如果gflags安装在自己指定的目录,则建议编写Makefile更方便一点:
GFLAGS_DIR = /usr/local/include/gflags
LIB_DIR = /usr/local/lib/
gflags_test: gflags_test.cc
g++ -I${GFLAGS_DIR} -L${LIB_DIR} gflags_test.cc -o gflags_test -lgflags
clean:
rm -f gflags_test
运行:
以下为我的测试过程
cpp_practice % ./gflags_test #默认参数
count = 100
entry = str_string
judge is false !
% ./gflags_test --count 20 --entry test_argv --judge true #指定参数
count = 20
entry = test_argv
judge is true !
cpp_practice % ./gflags_test --version #查看版本信息
gflags_test version 1.3
cpp_practice % ./gflags_test --help #查看帮助信息
gflags_test: help info messages
以上同样的解析过程,如果是getopt_long
,则需要至少3倍的代码量才能够实现相同的功能。
不过这个只能用在C++或者python中,就有点尴尬了