用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

posted on 2015-09-10 17:48  月未央  阅读(2870)  评论(0编辑  收藏  举报

导航