gflags简单应用

描述

一些利用gflag的小代码

参考文章https://www.cnblogs.com/myyan/p/4798679.html

代码

gflags::ParseCommandLineFlags(&argc, &argv, false)用于解析命令行参数,false在解析后不会删除argv的值,true会删除。

总的代码如下

#include <iostream>
#include <gflags/gflags.h>
 
DEFINE_bool(value_bool, true, "bool value");
DEFINE_int32(value_int32, 2147483647, "int32 value");
DEFINE_int64(value_int64, 9223372036854775807, "int64 value");
DEFINE_uint64(value_uint64, 18446744073709551615, "uint64 value");
DEFINE_double(value_double, 1.1, "double value");
DEFINE_string(value_string, "../path", "string value");

int main(int argc, char** argv)
{
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    printf("---------------here--------------\n");

    gflags::SetVersionString("1.0.0.0");
    gflags::SetUsageMessage("Usage : ./demo ");
    gflags::ParseCommandLineFlags(&argc, &argv, false); 

    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    printf("---------------there--------------\n");

    std::cout << "value_bool = "   << FLAGS_value_bool   << std::endl;
    std::cout << "value_int32 = "  << FLAGS_value_int32  << std::endl;
    std::cout << "value_int64 = "  << FLAGS_value_int64  << std::endl;
    std::cout << "value_uint64 = " << FLAGS_value_uint64 << std::endl;
    std::cout << "value_double = " << FLAGS_value_double << std::endl;
    std::cout << "value_string = " << FLAGS_value_string << std::endl;


    gflags::ShutDownCommandLineFlags();
    return 0;
}

CMakeLists.txt

find_package(Gflags REQUIRED)
target_link_libraries(try gflags)

运行

如果你输入超过int64等类型的定义值,会报错

./try --value_bool=false --value_int32=2147483648 --value_int64=9223372036854775809 --value_uint64=18446744073709551616 --value_double=2.2 --value_string=../a.txt

结果提示

argv[0] = ./try
argv[1] = --value_bool=false
argv[2] = --value_int32=2147483648
argv[3] = --value_int64=9223372036854775809
argv[4] = --value_uint64=18446744073709551616
argv[5] = --value_double=2.2
argv[6] = --value_string=../a.txt
---------------here--------------
ERROR: illegal value '2147483648' specified for int32 flag 'value_int32'
ERROR: illegal value '9223372036854775809' specified for int64 flag 'value_int64'
ERROR: illegal value '18446744073709551616' specified for uint64 flag 'value_uint64'

正确输入参数执行后

./try --value_bool=false --value_int32=2147483647 --value_int64=9223372036854775807 --value_uint64=18446744073709551615 --value_double=2.2 --value_string=../a.txt

会得到正确输入结果

argv[0] = ./try
argv[1] = --value_bool=false
argv[2] = --value_int32=2147483647
argv[3] = --value_int64=9223372036854775807
argv[4] = --value_uint64=18446744073709551615
argv[5] = --value_double=2.2
argv[6] = --value_string=../a.txt
---------------here--------------
argv[0] = ./try
argv[1] = --value_bool=false
argv[2] = --value_int32=2147483647
argv[3] = --value_int64=9223372036854775807
argv[4] = --value_uint64=18446744073709551615
argv[5] = --value_double=2.2
argv[6] = --value_string=../a.txt
---------------there--------------
value_bool = 0
value_int32 = 2147483647
value_int64 = 9223372036854775807
value_uint64 = 18446744073709551615
value_double = 2.2
value_string = ../a.txt

参数验证

gflags使用RegisterFlagValidator用于参数验证的一个例子

static bool ValidatePort(const char* flagname, gflags::int32 value) {
  if (value >= 36800 && value <= 36888) {
    printf("param(%s) = (%d) is valid!\n", flagname, value);
    return true;
  }
 
  printf("param(%s) = (%d) is invalid!\n", flagname, value);
  return false;
}
DEFINE_int32(port, 36810, "program listen port");
static const bool validPort = gflags::RegisterFlagValidator(&FLAGS_port, &ValidatePort);

当然,我们仍然可以自己写的if-else来进行检查,我一般还是这样做的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值