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

【C++】google gflags详解

参考博客;https://blog.csdn.net/lezardfu/article/details/23753741

0、简介

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*
1、命令行标记 和 命令行参数

例如:fgrep -l -f /var/tmp/foo johannes brahms
“-l” 和 “-f /var/tmp/foo”是命令行标记;
“johannes” 和 “brahms”是命令行参数
注意:gflags只能处理命令行标记(Commandline flags ),不会处理命令行参数(commandline arguments)

2、定义命令行标记

头文件:#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命令行标记时,会打印这些说明信息

3、使用命令行标记

使用“FLAGS_”前缀的宏,来访问命令行标记
例如:

  //首先通过gflags来分析命令行标记gflags::ParseCommandLineFlags(&argc, &argv, true);	if (FLAGS_quiet){std::cout << "hello world" << std::endl;std::cout << "fileName = " << FLAGS_infile << std::endl;;}
4、gflgs常用函数(参见头文件《gflags.h》)
//使用--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: falseFlags 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: stringdefault: ""-undefok (comma-separated list of flag names that it is okay to specify onthe command line even if the program does not define a flag with thatname.  IMPORTANT: flags in this list that have arguments MUST use theflag=value format) type: string default: ""Flags from src/gflags_completions.cc:-tab_completion_columns (Number of columns to use in output for tabcompletion) type: int32 default: 80-tab_completion_word (If non-empty, HandleCommandLineCompletions() willhijack the process and attempt to do bash-style command line flagcompletion 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: booldefault: 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: stringdefault: ""-helppackage (show help on all modules in the main package) type: booldefault: false-helpshort (show help on only the main module for this program) type: booldefault: false-helpxml (produce an xml version of help) type: bool default: false-version (show version and build info and exit) type: bool default: false
5、最简单的示例
#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
6、使用子命令的方法

原理是,利用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;;}
}

相关文章:

何恺明等人新作:效果超ResNet,利用NAS方法设计随机连接网络 | 技术头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑译者 | 刘畅编辑 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;受人工设计的启发&#xff0c;用于图像识别的神经网络从简单的链状模型发展为具有多个分支的网络。ResN…

网络规划设计师考试命题模式持续在变   你变不变

命题模式持续在变 你变不变深入分析2009下半年&#xff5e;2010下半年3次网络规划设计师考试试卷中项目管理模块&#xff08;约有5~8题&#xff0c;约占总分数的6.67%~10.67%&#xff09;的命题规律&#xff0c;心中最强烈的一份感觉体现在一个字——变。“变”是事物持续发…

【C++】google glog详解

0、简介 glog是google的日志管理系统&#xff0c;配合gflags库&#xff0c;通过命令行参数管理日志。 源码下载&#xff1a;https://github.com/google/glog ubuntu安装&#xff1a; sudo apt-get install libgoogle-glog*参考博客&#xff1a; https://blog.csdn.net/jcjc91…

仿抖音注册界面制作

话说上次完成了仿抖音我的界面制作之后&#xff0c;今天抽空又把注册界面给做了&#xff0c;还是做了些小改动&#xff0c;将第三方登录去掉了 注册还是老规矩直接奉上psd源码&#xff1a;仿抖音注册界面psd源码 个人博客https://myml666.github.io

00后的AI开发者进阶之道:从入门到鏖战MIT编程大赛 | 人物志

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑作者 | 若名出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;当所有中国的高中生都在拼命为跨过高考这道窄门疲惫不堪时&#xff0c;美国的准高中毕业生们也开始申请大学&#x…

js的全部替换函数replaceAll

JS替换功能函数&#xff0c;用正则表达式解决&#xff0c;js的全部替换&#xff0c;学习js的朋友可以参考下。 alert("abacacf".replace(a,9)); alert("abacacf".replace(/a/g,9)); 第一个运行的结果 9bacaf 这个只是替换了第一个 第二个运行的结果 9b9c9f…

【C++】Google Protocol Buffer(protobuf)详解(一)

1、简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准&#xff0c; Protocol Buffers 是一种轻便高效的结构化数据存储格式&#xff0c;可以用于结构化数据串行化&#xff0c;或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通…

python使用difflib对比文件示例

使用difflib模块对比文件内容1 示例&#xff1a;字符串差异对比 vim duibi.py#!/usr/bin/env python # -*- coding: utf-8 -*- import re import os import difflib tex1"""tex1: this is a test for difflib ,just try to get difference of the log 现在试试…

技术大佬们都推荐的vim学习指南来了,值得收藏!

「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑作者 | kbsc13&#xff0c;京东算法工程师&#xff0c;研究领域计算机视觉来源 | 机器学习与计算机视觉&#xff08;ID&#xff1a;AI_Developer&#xff09;编辑 | Jane【导语】在 Linux 下最常使用的文本编辑…

NoSQl分类

2019独角兽企业重金招聘Python工程师标准>>> http://nosql-database.org/ nosql简单分类 类型 部分代表 特点 列存储 hbase cassandra hypertable 顾名思义&#xff0c;是按列存储数据的。最大的特点是方便存储结构化和半结构化数据&#xff0c;方便做数据压缩&…

手撕代码之七大常用排序算法 | 附完整代码

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓&#xff0c;请扫码咨询 ↑↑↑0.导语本节为手撕代码系列之第一弹&#xff0c;主要来手撕排序算法&#xff0c;主要包括以下几大排序算法&#xff1a;直接插入排序冒泡排序选择排序快速排序希尔排序堆排序归并排序…

【C++】google gtest 详解

1、参考博客&#xff1b; https://blog.csdn.net/baijiwei/article/details/81265491 https://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 2、编译和安装 $ git clone https://github.com/google/googletest.git $ cd googletest $ mkdir mybuild $ cd mybui…

JS学习笔记之call、apply的用法

1、call和apply的区别 call和apply唯一的区别是传入参数的形式不同。 apply接受两个参数&#xff0c;第一个参数指定了函数体内this对象的指向&#xff0c;第二个参数为一个带下标的集合&#xff0c;可以是数组&#xff0c;也可以是类数组&#xff0c;apply方法会把集合中的元素…

实验LVS+keepalived

lvs说明:目前有三种IP负载均衡技术&#xff08;VS/NAT、VS/TUN和VS/DR&#xff09;&#xff1b;八种调度算法&#xff08;rr,wrr,lc,wlc,lblc,lblcr,dh,sh&#xff09;。在调度器的实现技术中&#xff0c;IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转…

Spark Streaming笔记整理(二):案例、SSC、数据源与自定义Receiver

[TOC] 实时WordCount案例 主要是监听网络端口中的数据&#xff0c;并实时进行wc的计算。 Java版 测试代码如下&#xff1a; package cn.xpleaf.bigdata.spark.java.streaming.p1;import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.spark.Spar…

复旦邱锡鹏教授公布《神经网络与深度学习》,中文免费下载 | 极客头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑整理 | Jane出品 | AI科技大本营优质的人工智能学习资源一直是大家非常关注的&#xff0c;以往我们也推荐过很多优秀的课程、书籍等&#xff0c;不过大多来自国外的名校、名师&#xff0c…

【Qt】信号和槽传递自定义结构体

一、使用信号和槽传递自定义结构体 这是一个老问题了,但是每次使用都要bing,因此做个笔记整理下。 一共有三种方法,可以让结构体在信号和槽之间传递。前两种方法可以让结构体在线程之间传递,最后一种方法只能在同一线程中传递。 Q_DECLARE_METATYPE qRegisterMetaType(推…

Tomcat:Connection reset by peer: socket write error

Connection reset by peer: socket write error错误分析及解决 Connection reset by peer: socket write error错误分析&#xff1a; 常出现的Connection reset by peer: 原因可能是多方面的&#xff0c;不过更常见的原因是&#xff1a; ①&#xff1a;服务器的并发连接数超过…

人脸识别的“生意经”

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑作者 | Jeff John Roberts译者 | 孙薇责编 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导语&#xff1a;不经意间&#xff0c;科技公司便拿着你的照片&#xff0c;推…

【Qt】pro中使用DEFINES来实现条件编译

1、pro中使用DEFINES来实现条件编译 在Qt的pro文件中使用DEFINES 来实现类似gcc -D的条件编译功能。 如,在pro中: #定义条件编译宏LAOER DEFINES += LAOER #依赖编译宏LAOER的编译选项: contains(DEFINES, LAOER){message(hello Laoer) } #与编译宏LAOER冲突的编译选项: …

nodejs -- promise的返回

为什么80%的码农都做不了架构师&#xff1f;>>> [javascript] view plain copy const a async () > { return Sequelize.findAll({}) //这里返回一个promise&#xff0c;"aaaaa"也行 } const b async ()>{ const result await a…

SQL 将一列数据转为一行字符串[转]

比如&#xff1a;我用select department,userName from users从表中查询出如下数据department | userName--------------- --------------it it1it it2it it3ur ur1ur ur2我能不能用什么SQL对department进行分组然后变成如下的结果呢&#xff1f;department | userName--------…

【C++】C++11的enum class enum struct和enum

1、问题描述 在走读QtCreator中看到一段代码 在QtCreator-v4.9.2源码中 src\plugins\projectexplorer\projectnodes.h enum class NodeType : quint16 {File 1,Folder,VirtualFolder,Project };以前一直使用enum&#xff0c;这里使用的是enum class&#xff0c;新enum的好处…

浙大首届AI专业本科生将于9月入学,纳入竺院图灵班

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近日&#xff0c;据澎湃新闻报道&#xff0c;浙江大学计算机科学与技术学院副院长、浙江大学人工智能研究所所长吴飞…

解决阿里云无法正常使用samba的问题【转】

转自&#xff1a;https://blog.csdn.net/u011949148/article/details/54311288 昨天在阿里云上申请了一个云服务器&#xff0c;系统用的是ubuntu14.04&#xff0c;由于是免费的&#xff08;初次使用&#xff09;&#xff0c;配置较低&#xff08;单核1G内存&#xff0c;40G硬盘…

Google又放大招:高效实时实现视频目标检测 | 技术头条

点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」&#xff0c;购票请扫码咨询 ↑↑↑作者 | 陈泰红&#xff0c;算法工程师&#xff0c;研究方向为机器学习、图像处理来源 | 极市平台&#xff08;ID&#xff1a;extrememart&#xff09;图像目标检测是图像处理领域的基础。…

一个java删除文件夹的小方法

java删除文件夹都是从里向外删除&#xff0c;使用递归的方法。public class IO_FILEdemo09 {public static void main(String[] args) {// TODO Auto-generated method stub// 删除目录演示File dir new File("C:\\version1");DeleteAll(dir);}public static void D…

【C++】operator bool() 和 operator const bool() const

1、问题描述 在走读QtCreator源码时&#xff0c;看到如下运算符重载 源码在QtCreator-v4.9.2中 src\plugins\projectexplorer\projectexplorer.h class OpenProjectResult { public:OpenProjectResult(const QList<Project *> &projects, const QList<Project *…

tomcat高并发的配置

以下内容来源于互联网&#xff0c;具体出处不详 据说服务器运行TOMCATJDK环境能负载到动态1W的并发&#xff0c;贴上他的配置&#xff0c;以后有机会在测试&#xff01; java 环境配置&#xff1a; export JAVA_OPTS"-server -Xms8g -Xmx8g -Xss128k -XX:ParallelGCThread…

【AI】图示:精确度(查准率)Precision、召回率(查全率)Recall

对Precision、Recall的直译是“精确度”和“召回率”&#xff0c;第一次接触这两个词&#xff0c;很难从字面上知道它们的含义。而翻译成“查准率”和“查全率”就比较好理解&#xff0c;下面统一使用“查准率”和“查全率”。 1、真假正负例 真正例&#xff08;True Positive…