当前位置: 首页 > 工具软件 > Google GFlags > 使用案例 >

google gflags的参数解析,便捷实用

史鹏云
2023-12-01

命令行参数解析,一直是我们后段开发人员需要经常使用的一个功能,用来从终端解析接口的输入 ,并做出对应的处理。这里为使用C++/python的开发人员推荐一个便捷的命令行解析接口集 gflags。

我们之前使用C的getopt/getopt_long 函数需要自己使用其接口并编写大量的周边代码达到解析参数的目的,如果转到C++还使用上面的函数,代码会过于冗余。那么gflags就很好的解决了这个问题,我们不需要再数着冒号 "a️cd:"添加参数了,不需要为每个传入的参数做类型转化。

接下来的gflags 测试代码可以提前向下看一看,耳目一新,清晰明了。

支持的数据类型

  • DEFINE_bool
  • DEFINE_int32 : 32位的整型
  • DEFINE_uint32:无符号32位整型
  • DEFINE_int64:64位整型
  • DEFINE_uint64:无符号64位整型
  • DEFINE_double:浮点类型
  • DEFINE_string: C++ 的string类型

安装

详情可以参考:
install gflags

  • mac : brew install gflags
  • 其他linux系统:
    $ 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中,就有点尴尬了

 类似资料: