gflag的简单入门demo
gflags
一. 下载与安装
这里直接使用包管理器安装:
sudo apt install libgflags-dev
二. gflags的简单使用
1. 定义需要的类型
格式: DEFINE_类型名(变量名, 默认值, 描述语)
| 类型 | 定义格式 |
|---|---|
| bool类型 | DEFINE_bool |
| 32位的int类型 | DEFINE_int32 |
| 64位的int类型 | DEFINE_int64 |
| 64位的unsigned int 类型 | DEFINE_uint64 |
| double类型 | DEFINE_double |
| string类型 | DEFINE_string |
例子:
- 定义一个名为name的string类型的变量
DEFINE_string(name, "xiaoming", "this is the name who you love! ");
- 定义一个名为uppercase的bool类型的变量
DEFINE_bool(uppercase, true, "Whether the output characters are in Uppercase format! ");
- 定义一个名为count的int类型的变量
DEFINE_int32(count, 10, "Number of times the output is repeated! ");
2. 在命令行中给定义好的变量进行赋值操作:
--uppercase=true 或者 --uppercase
--uppercase=false 或者 --nouppercase
--name="china" 或者 --name "China"
--count=10 或者 --count 10
3. 在代码中使用定义好的变量
在代码中使用之前定义好的变量时,在每一个变量名前加FLAGS_的前缀就可以了.
| 定义的变量名 | 代码中使用的变量名 |
|---|---|
| name | FLAGS_name |
| uppercase | FLAGS_uppercase |
| count | FLAGS_count |
三. 小小的demo
1. demo.cpp文件的编写
#include <iostream>
#include <gflags/gflags.h>
using namespace std;
// 定义三个变量
DEFINE_string(name, "xiaoming", "this is the name who you love! ");
DEFINE_bool(uppercase, true, "Whether the output characters are in Uppercase format! ");
DEFINE_int32(count, 10, "Number of times the output is repeated! ");
// 绑定对变量name和count的值合法性的检测函数
static bool ValidateName(const char* flagname, const string& value);
DEFINE_validator(name, &ValidateName);
static bool ValidateCount(const char* flagname, int value);
DEFINE_validator(count, &ValidateCount);
/** @brief 主函数 */
int main(int argc, char* argv[])
{
// 进行解析命令行参数,true表示会修改argc和argv的值, 把相应的命令行参数去除掉。
gflags::ParseCommandLineFlags(&argc, &argv, true);
if (FLAGS_uppercase)
{
for (int i = 0; i < FLAGS_count; ++i)
cout << "I LOVE " << FLAGS_name << endl;
}
else
{
for (int i = 0; i < FLAGS_count; ++i)
cout << "i love " << FLAGS_name << endl;
}
return 0;
}
/** @brief 定义对变量name值合法性的检测函数 */
static bool ValidateName(const char* flagname, const string& value)
{
if (value.empty())
{
cout << "不应该输入空的参数值(" << flagname << " 的值为空) " << endl << endl;
return false;
}
return true;
}
/** @brief 定义对变量count值的合法性检测函数。 */
static bool ValidateCount(const char* flagname, int value)
{
if (value <= 0)
{
cout << "不应该输入小于或等于0的参数值(" << flagname << " 的值<= 0) " << endl << endl;
return false;
}
return true;
}
2. CMakeLists.txt文件的编写
cmake_minimum_required(VERSION 3.10.2)
project(gflag_demo VERSION 1.0.0)
add_executable(demo.out demo.cpp)
find_package(gflags REQUIRED)
target_link_libraries(demo.out gflags)
3. 编译
mkdir build
cd build
cmake ..
make
4. 运行
./demo.out --uppercase=false --name="China" --count=10
输出为:
i love China
i love China
i love China
i love China
i love China
i love China
i love China
i love China
i love China
i love China
gflag的简单入门demo的更多相关文章
- Quartz学习——Quartz简单入门Demo(二)
要学习Quartz框架,首先大概了解了Quartz的基本知识后,在通过简单的例子入门,一步一个脚印的走下去. 下面介绍Quartz入门的示例,由于Quartz的存储方式分为RAM和JDBC,分别对这两 ...
- 深入浅出Tabhost+简单入门Demo
小伙伴们在手机上逛淘宝的时候,会发现在淘宝的下面有个按钮,分别是首页.微淘.社区.购物车和我的淘宝,点击不同的按钮会跳转到不同的页面,目前小编所接手的这个项目,也需要用到类似这样的功能,小编就发挥网络 ...
- ECharts简单入门demo
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Dubbo入门—搭建一个最简单的Demo框架
一.Dubbo背景和简介 1.电商系统的演进 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. a.单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一 ...
- Dubbo入门---搭建一个最简单的Demo框架(转)
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
- Dubbo入门介绍---搭建一个最简单的Demo框架
Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbozookeeper 更多 个人分类: D ...
- Maven+SpringMVC+Dubbo 简单的入门demo配置
转载自:https://cloud.tencent.com/developer/article/1010636 之前一直听说dubbo,是一个很厉害的分布式服务框架,而且巴巴将其开源,这对于咱们广大程 ...
- Okio 1.9简单入门
Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...
随机推荐
- python基础之字典功能
python中字典是个很重要的功能,使用键值(key-value)存储,具有极快的查找速度.值得注意的是,字典的key要为不可变对象,比如字符串.字母,但不能是可变的,比如列表等. 1.字典的定义: ...
- jmeter-json提取器提取的内容含”引号
这时如果直接赋值会报错 解决方法: 1.用vars.get("Object")提取变量的值 2.用代码提取,最后把提取到的Object或Array转为String
- Blazor client-side + webapi (.net core 3.1) 添加jwt验证流程(非host)第一步
第一步,设置并检查CROS跨域请求 因为我们并不打算将Blazor 由webapi来进行host,所以Blazor和api将是两个域名,这样操作即方便以后单独使用Blazor来写前端,但后端采用已有或 ...
- MySql学习-2. NavicatforMySQL 与 MySql的对接以及一些操作:
1.连接: 2.数据库的创建: 3.数据库中表的创建: 4.表的设计: 4.1 设计表: 4.2 增加数据(自动递增只是保证唯一值,即使数据删除了也是得前进):
- opencv中的图像矩(空间矩,中心矩,归一化中心矩,Hu矩)
严格来讲矩是概率与统计中的一个概念,是随机变量的一种数字特征.设 x 为随机变量,C为常数,则量E[(x−c)^k]称为X关于C点的k阶矩.比较重要的两种情况如下: 1.c=0,这时a_k=E(X^k ...
- 解决jQuery中input 失去焦点之后,不能再获取到焦点
//编辑过敏史 if(iToolbar == 'editGMS'){ lstype="gms"; var gms=""; if(gmstype=="0 ...
- 获取redis实例绑定cpu的情况
redis是一个单线模型的nosql类型的数据库,而目前接触到的服务器大都是多核的,比如8c,16c,32c,64c等等.为了充分利用主机,在一台主机上必然会部署多个redis实例,默认情况cpu会随 ...
- egg 提交数据 防csrf 攻击 配置
await ctx.render('from',{csrf:this.ctx.csrf}); 或者 使用中间件 ctx.state.csrf = ctx.csrf;
- 洛谷题解 P1744 【采购特价商品】
原题传送门 题目描述 中山路店山店海,成了购物狂爱与愁大神的"不归之路".中山路上有n(n<=100)家店,每家店的坐标均在-10000~10000之间.其中的m家店之间有通 ...
- Pikachu-SSRF(服务器端请求伪造)
SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制 导致攻击者可 ...