zoukankan      html  css  js  c++  java
  • 用Google的gflags轻松的编码解析命令行参数

    支持的参数类型

    gflags支持的类型有bool,int32,int64,uint64,double和string。可以说这些基本类型大体上满足了我们的需求。

    1. DEFINE_bool: boolean
    2. DEFINE_int32: 32-bit integer
    3. DEFINE_int64: 64-bit integer
    4. DEFINE_uint64: unsigned 64-bit integer
    5. DEFINE_double: double
    6. DEFINE_string: C++ string

    比如上文中,我就定义了confPath, port, daemon三个命令行参数,回顾一下:

    稍微讲解一下:

    • 第一个字段 confPath就是命令行里要输入的参数名,比如 –confPath=./love.ini
    • 第二个字段”../conf/setup.ini”,就是如果命令行里没指定这个参数,那默认值就是 ../conf/setup.ini
    • 第三个字段”program configure file.”,就是这个参数的帮助说明信息,当用户输入 –hlep 的时候,会显示出来。

       代码中使用这个变量

    以前我们使用getopt_long函数来自己解析命令行参数的时候,都得内部定义一个变量来保存从命令行得到的值。后续就可以使用这个变量来完成相应的代码逻辑。那其实,DEFINE_string等“指令”就相当于定义了变量,只不过变量名多了个前缀 “FLAGS_“。即,我们可以在代码里面直接操作FLAGS_confPath,FLAGS_port,FLAGS_port,FLAGS_daemon这三个变量。

        解析命令行参数

    gflags是使用ParseCommandLineFlags这个方法来完成命令行参数的解析的。具体如下:

    一目了然,唯一值得注意的就是第三个参数了。如果设置为true,gflags就会移除解析过的参数。即argc, argv就会变了。否则gflags还会保持这些参数继续留在argc,argv中。但是参数的顺序有可能会发生变化。

    如果不好理解的话,没关系,来一段代码就明白什么意思了。

    运行后,看一下true的情况:

    修改为false,在运行一下的情况:

        参数检查

    按照以前的习惯,我们可以获取到所有参数的值后,再在代码里面进行判断这个参数是否是我们想要的。比如,我们需要端口是36800 到 36888之间的,那我们可以这样检查。

    当然gflags里面建议使用 RegisterFlagValidator 这个方法来做参数检查。参数不通过的时候,程序是启动失败的。

    运行一下,看看效果:

    【疑问】:我们手动指定端口36889不合法,默认的36810合法。怎么让gflags当发现参数不合法的时候,使用合法的默认参数呢?!

        其他代码文件使用参数变量

    正常来说,我们的代码不可能只有1个cpp,还会有很多模块。而每个模块可能会使用到不同的参数值。所以我们之前在demo.cpp定义的参数变量(比如FLAGS_port),在其他模块怎么引用和使用呢?so easy,与DEFINE相对应的有DECLARE。声明一下,就可以使用了。

    1. DECLARE_bool: boolean
    2. DECLARE_int32: 32-bit integer
    3. DECLARE_int64: 64-bit integer
    4. DECLARE_uint64: unsigned 64-bit integer
    5. DECLARE_double: double
    6. DECLARE_string: C++ string

    来一段简单的代码,就一目了然啦。

         示例代码目录结构

        logic.h

         logic.cpp

       demo.cpp

        CMakeLists.txt

        运行结果

    至此,Google的强大的开源组件之一的“gflags”,就算完成了深入浅出的学习了。自己以后可以把getopt_long深藏功与名了。哈哈。

    转自:http://www.leoox.com/?p=275

  • 相关阅读:
    第六天20160802
    第五天20160801
    关于表单元素input的美化
    关于Oracle默认用户名system密码不正确登录不上解决方案
    ORCALE安装教程
    [INS-32021]此卷上用于所选Oracle主目录的磁盘空间不足
    Linux下利用nc命令传输文件
    golang与 postgresql简单的增删改查
    Golang 调用 C/C++,例子式教程
    c# EF中equal的用法注意
  • 原文地址:https://www.cnblogs.com/myyan/p/4798679.html
Copyright © 2011-2022 走看看