当前位置: 首页 > 编程日记 > 正文

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

命令行参数解析,一直是我们后段开发人员需要经常使用的一个功能,用来从终端解析接口的输入 ,并做出对应的处理。这里为使用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 stringSetVersionString(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.ccg++ -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.3cpp_practice % ./gflags_test --help #查看帮助信息
gflags_test: help info messages

以上同样的解析过程,如果是getopt_long,则需要至少3倍的代码量才能够实现相同的功能。

不过这个只能用在C++或者python中,就有点尴尬了

相关文章:

linux进程下的线程数,Linux下查看进程线程数的方法

0x01&#xff1a;ps -ef只打印进程&#xff0c;而ps -eLf会打印所有的线程[rootcentos6 ~]# ps -ef | grep rsyslogdroot 1470 1 0 2011 ? 00:01:13 /sbin/rsyslogd -c 4root 29865 28596 0 22:45 pts/5 00:00:00 grep rsyslogd[rootcentos6 ~]# ps…

OpenCV学习(20) grabcut分割算法

在OpenCV中&#xff0c;实现了grabcut分割算法&#xff0c;该算法可以方便的分割出前景图像&#xff0c;操作简单&#xff0c;而且分割的效果很好。算法的原理参见papaer&#xff1a;“GrabCut” — Interactive Foreground Extraction using Iterated Graph Cuts 比如下面的一…

VMware workstation中rhel安装VMware tools失败

切换登录用户为root即可转载于:https://www.cnblogs.com/dazzleC/p/10555809.html

g-git 相关命令 及其 基本原理探索(二):git 在工作中的常用命令操作 ,超级实用!!!

上一篇git 基本原理对git的使用以及文件分布已经有了一个整体的了解。 本篇将对工作中常用的一些git 操作命令的操作进行总结归纳&#xff0c;方便今后查阅。 文章目录1. 分离头指针2. 通过HEAD 来进行不同提交的差异对比3. 删除不需要的分支4. 对当前分支最近一次提交的messag…

Linux中的文件寻址,Linux文件寻址算法:逻辑地址到物理地址的转换

题目描述&#xff1a;编写一个函数实现Linux文件寻址的算法&#xff0c;即读取文件当前位置到物理存储位置的转换函数&#xff0c;需要给出运行的测试数据&#xff0c;可以假设和模拟需要的数据和结构。即编写一个函数unsigned long ltop(unsigned long logblkNum). 计算逻辑块…

datatable和dataset的区别

DataSet 是离线的数据源 DataTable 是数据源中的表.当然也可以自己建一张虚表。插入数据库中 DataSet是DataTable的容器DataSet可以比作一个内存中的数据库&#xff0c;DataTable是一个内存中的数据表&#xff0c;DataSet里可以存储多个DataTabledatatable是dataset中的一个表另…

如何避免重构带来的危险

http://blog.jobbole.com/30049/ 重构代码很危险&#xff0c;它会给测试工作增加巨大的负担。除非你的程序需要重构&#xff0c;一定不要轻易重构代码。我这里所说的并不是把一个for循环改成while循环&#xff0c;或把一个StringBuffer改成StringBuilder&#xff0c;我说的是大…

ip通信(第二周)

计算机网络分为局域网&#xff08;LAN&#xff09;、城域网&#xff08;MAN&#xff09;和广域网&#xff08;WAN&#xff09;。拓扑结构分为星型网&#xff0c;树形网&#xff0c;分布式网络&#xff0c;总线型网络&#xff0c;环型网络和复合型网络。认识了几个常见的国际标准…

《DDIA》读书笔记

数据存储系统的经典书籍&#xff1a; 从数据系统的特性开始&#xff0c;先讲单机存储引擎 再到 分布式存储系统&#xff0c;最后到一些数据流的处理方式&#xff0c;作者深入浅出&#xff0c;译者更是精雕细琢&#xff0c;本书需要细品。 将持续阅读整理&#xff0c;先从理论走…

linux网卡设置adsl上网,Linux下设置ADSL自动拨号上网

前段时间下载了红帽的linux&#xff0c;版本为redhat 9.0&#xff0c;整整刻了三张CD。最初是为了体验一下linux下QQ聊天软件的功能&#xff0c;最后因内核太低(官方推荐内核在2.6以上&#xff0c;我下载的版本是2.4)而告终。最大的收获是了解了linux下文件系统及linux下软件与…

安卓天天酷跑脚本刷高分图文教程

http://news.gamedog.cn/a/20130923/241742.html

SpringBoot 中 JPA 的使用

前言 第一次使用 Spring JPA 的时候&#xff0c;感觉这东西简直就是神器&#xff0c;几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。下面我们就用一个例子来讲述以下 JPA 使用的基本操作。 新建项目&#xff0c;增加依赖 在 Intellij IDEA 里面新建一个…

《DDIA》读书笔记(一):可靠性、可扩展性、可维护性

这一节描述了密集型应用的基本思考方式。 可靠性。意味着系统发生故障&#xff0c;也能保持正常的运行。故障会集中在三个方面&#xff0c;硬件故障(通常是随机和不相关的)、软件故障(通常是系统性的bug,较难发现&#xff0c;较难处理)&#xff0c;人为故障(不可避免得时不时出…

TCP协议-TCP连接管理

TCP协议是 TCP/IP 协议族中一个非常重要的协议。它是一种面向连接、提供可靠服务、面向字节流的传输层通信协议。TCP(Transmission Control Protocol,传输控制协议)。

[Unity WWW] 跨域访问解决方法

什么是跨域访问 域(Domain)是Windows网络中独立运行的单位&#xff0c;域之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后&#xff0c;2个域之间不但可以按需要相互进行管理&#xff0c;还可以跨网分配…

linux环境安全测评实验报告,linux第一次实验报告

iframe载入页面过程显示动画效果http://www.xfeixiang.com/Bug/Detail/A2FD7EFFA8CA72F1加密算法使用(三)&#xff1a;用用BASE64采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到 package testEncrypt; import java.security.Key; import java.secu ...jav…

2019-03-20 Python爬取需要登录的有验证码的网站

当你向验证码发起请求的时候&#xff0c;就有session了&#xff0c;记录下这次session因为每当你请求一次验证码 或者 请求一次登录首页&#xff0c;验证码都在变动验证码的链接可能不是固定的&#xff0c;可能需要GET/POST请求,获取那部分变动的信息 session requests.sessio…

Mac上 如何快速玩起rocksdb

想要自己随时随地写一写rocksdb的代码&#xff0c;并且快速测试&#xff0c;但是公司的物理机登陆过于麻烦&#xff0c;想要验证功能的话其实在自己的电脑就完全可以了。 安装 brew install rocksdb&#xff0c;默认二进制文件安装在/usr/local/bin在~/.bashrc或者自己正在使用…

OC学习篇之---对象的拷贝

在前一篇文章中我们说到了如何解决对象的循环引用问题&#xff1a;http://blog.csdn.net/jiangwei0910410003/article/details/41926369&#xff0c;这一篇文章我们就来介绍一下OC中的对象拷贝概念&#xff0c;这个对于面向对象语言中都会有这种的问题&#xff0c;只是不同的语…

linux脚本自定义赋值,JMeter——运用BeanShell给自定义的变量动态赋值

这个计划中定义了以下组件&#xff1a;用户自定义变量&#xff1a;里面定义了2个变量&#xff0c;一个是us(注意&#xff0c;未对它初始化)&#xff0c;一个变量名是&#xff1a;test &#xff0c;值为&#xff1a;123456一个BeanShell Sampler:${test}表示传入BeanShell Sampl…

VS2010与Qt设置出现红线提示

任何类库导入都有可能出现红线&#xff0c;主要原因是“包含目录没有设置”点击“项目”-> &#xff08;你的项目&#xff09;属性->配置属性->VC目录->包含目录 把你的目录写入&#xff08;我的是&#xff1a;H:\Qt\4.8.5\include&#xff09;点击确定~ 完成。转载…

java-方法。(新手)

//导入包。import java.util.Arrays;import java.util.Calendar;import java.util.Date;//创建的一个类。public class zylx1 { //公共静态的主方法。 public static void main(String[] args){ //调用方法。 lx8(); } //创建方法。//使日历向后偏移…

《Bigtable:a distributed storage system for struct data》笔记

Bigtable 可以说是log-structed以及page-oriented 两种存储引擎的整合体&#xff0c;我们性能优越的单机存储引擎leveldb和rocksdb就是基于google的bigtable存储系统实现的。 论文地址Bigtable: A Distributed Storage System for Structured Data bigtable是基于分布式的存储…

linux 查看线程详细信息,Linux 下查看线程信息

1. 使用 pstree -p PIDps aux | grep firefox | grep -v grepcharles 26058 0.0 0.0 4908 1152 ? S 19:17 0:00 /bin/sh /usr/lib/firefox-3.5.4/run-mozilla.sh /usr/lib/firefox-3.5.4/firefoxcharles 26073 7.6 3.4 284264 70164 ? Sl 19:1…

Bootstrap学习的点点滴滴

1&#xff09;网站&#xff1a;http://www.bootcss.com/http://v3.bootcss.com/getting-started/#downloadhttps://github.com/twbs/bootstraphttp://getbootstrap.com杭州移动用的是2.3版本&#xff0c;手册地址&#xff1a; http://docs.bootcss.com/bootstrap-2.3.2/docs/ja…

Angry Grammar Nazi

Angry Grammar Nazi 1、给出的几个要处理的字符串没有重复性&#xff08;子串&#xff09;&#xff0c;不必考虑某个单词是算在哪个种类中&#xff1b; 2、给出的几个要处理的字符串&#xff08;除了“lol”&#xff09;都是单词或短语&#xff0c;可以直接搜索 3、给出的处理长…

Linux——查看

查看当前系统版本&#xff1a; lsb_release -a #没有装&#xff1a;yum install lsb 查看当前运行端口&#xff1a; netstat -atunlp #没有装&#xff1a;yum install net-tools -a &#xff1a;all&#xff0c;表示列出所有的连接&#xff0c;服务监听&#xff0c;Socket…

Rocksdb 事务(一): 隔离性的实现

文章目录前言1. 隔离性2. Rocksdb实现的隔离级别2.1 常见的四种隔离级别2.2 Rocksdb 支持的隔离级别及基本实现2.2.1 ReadComitted 隔离级别的测试2.2.2 ReadCommitted的实现2.2.3 RepeatableRead的实现2.2.4 事务并发处理3. 一些总结前言 Rocksdb 作为单机存储引擎&#xff0…

linux镜像修改密码,OpenStack 镜像修改密码方案

现在各大linux厂商&#xff0c;其实已经有专门给openStack提供的镜像&#xff0c;不过国内的朋友&#xff0c;不太习惯老外做镜像的方式&#xff0c;经常问密码是多少。本博客提供几种修改密码方案&#xff0c;仅供参考。前言对OpenStack云主机来说&#xff0c;有以下几种方式登…

专题8-Linux系统调用

1.从用户空间到内核空间的时候需要进行系统调用 2.系统调用通过swi指令实现&#xff0c;这个时候会有一个参数&#xff0c;存放到r7寄存器&#xff0c;用来指定要调用的内核态函数。 3.一般内核态的实际函数可以再任意的.c文件实现&#xff0c;但是必须在call.S里面加上相应的函…