ITKeyword,专注技术干货聚合推荐

注册 | 登录

Google命令行工具gflags使用

zhangweilong219 分享于 2017-04-02

推荐:Google开源命令行参数解析库gflags

今天写程序时需要写一个命令行解析程序,于是网上搜索getopt()的实现代码,但搜到的信息基本上是如何使用getopt(),而系统又是Windows的;于是想到了以前项目中

2019阿里云全部产品优惠券(新购或升级都可以使用,强烈推荐)
领取地址https://promotion.aliyun.com/ntms/yunparter/invite.html

google-gflags
gflags是google的一个开源的处理命令行参数的库,使用c++开发,具备python接口,可以替代getopt。

gflags使用起来比getopt方便,但是不支持参数的简写(例如getopt支持--list缩写成-l,gflags不支持)。

1.类型

定义gflags的宏:DEFINE_xxxxx(变量名,默认值,help-string) 定义在文件当中(使用全局)

  • 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

声明:DECLARE_xxxxx(变量)

2.参数传递

<1>在命令行指定参数,都可以使用“”引起,如果是字符串中间有空格一定得使用“”,

前面使用“--”或者使用“-”
--languages="chinese,        japanese,korean"

-languages="chinese,        japanese,korean"
-languages="chinese"

-languages=chinese

-languages chinese

-languages "chinese"

--languages=chinese

<2>使用文件传递参数--flagfile

--flagfile 从文件读取参数值,--flagfile=my.conf表明要从my.conf文件读取参数的值。在配置文件中指定参数值与在命令行方式类似,另外在flagfile里可进一步通过--flagfile来包含其他的文件。my.conf每一个命令参数为一行.

<3>对于bool类型,则可通过如下几种方式指定参数
--big_menu
--nobig_menu
--big_menu = true
--big_menu = false

<4>特殊参数

--help 打印定义过的所有参数的帮助信息
--version 打印版本信息 通过google::SetVersionString()指定
--nodefok  但命令行中出现没有定义的参数时,并不退出(error - exit)
--fromenv 从环境变量读取参数值 --fromenv=foo, bar表明要从环境变量读取foo,bar两个参数的值。通过export FLAGS_foo = xxx; export FLAGS_bar = yyy 程序就可读到foo,bar的值分别为xxx,yyy。如果想使用更通用的方法使用getenv()
--tryfromenv 与--fromenv类似,当参数的没有在环境变量定义时,不退出(fatal - exit)

<5>检验输入参数是否合法:gflags库支持定制自己的输入参数检查的函数,

bool RegisterFlagValidator(const bool*  flag, bool (*validate_fn)(const char*, bool));
bool RegisterFlagValidator(const int32* flag, bool (*validate_fn)(const char*, int32));
bool RegisterFlagValidator(const uint32* flag, bool (*validate_fn)(const char*, uint32));
bool RegisterFlagValidator(const int64*  flag, bool (*validate_fn)(const char*, int64));
bool RegisterFlagValidator(const uint64*  flag, bool (*validate_fn)(const char*, uint64));
bool RegisterFlagValidator(const double*  flag, bool (*validate_fn)(const char*, double));
bool RegisterFlagValidator(const std::string* flag, bool (*validate_fn)(const char*, const std::string&));

如下:

//对string的检测 static bool ValidatePortStr(const char* flagname, const std::string &value) {  if (!value.empty())   // value is ok  {  printf("valid value for --%s: %s\n", flagname, value.c_str());  return true;  }  printf("Invalid value for --%s: %s\n", flagname, value.c_str());;  return false; } DEFINE_string(port_string, "", "What port to listen on string"); static const bool port_dummyStr = google::RegisterFlagValidator(&FLAGS_port_string, &ValidatePortStr); //对int的检测 static bool ValidatePort(const char* flagname, google::int32 value) {  if (value > 0 && value < 32768)   // value is ok  {  printf("valid value for --%s: %d\n", flagname, (int)value);  return true;  }  printf("Invalid value for --%s: %d\n", flagname, (int)value);  return false; } DEFINE_int32(port, 0, "What port to listen on"); static const bool port_dummy = google::RegisterFlagValidator(&FLAGS_port, &ValidatePort);

3.例子

#include "stdafx.h"
#include <string>
#include <iostream>
#include "gflags/gflags.h"//头文件
#pragma comment(lib,"gflagsd.lib")//lib
//变量名称 默认参数 说明
DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing");
DEFINE_string(languages, "english,french,german", "comma-separated list of languages to offer in the 'lang' menu");
DEFINE_int32(a, 33,"");
//DECLARE_string(languages);当在其他文件中使用的时候
int main(int argc, char* argv[])
{
/*google::SetCommandLineOption("languages","china");*/
//google::SetUsageMessage("设置提示语");
google::ParseCommandLineFlags(&argc, &argv, true);//初始化


//google::CommandLineFlagInfo info;//判断用户是否设置这个参数
//if (GetCommandLineFlagInfo("languages", &info) && info.is_default) {
// FLAGS_languages = "asads";
//}
if (!FLAGS_languages.empty())
{
std::cout << FLAGS_languages << std::endl;
}
if (FLAGS_a)
{
std::cout << FLAGS_a << std::endl;
}
std::cout << FLAGS_big_menu << std::endl;
return 0;
}


推荐:Ogre命令行工具包使用说明

这个工具包包含了一些对Ogre资源文件进行操作的预处理命令行工具。 它包括OgreXMLConveter, OgreMeshUpgrade, OgreMaterialUpgrade和MeshMagick。 您可以在这里

google-gflags gflags是google的一个开源的处理命令行参数的库,使用c++开发,具备python接口,可以替代getopt。 gflags使用起来比getopt方便,但是不支持参数的简写(例如getopt支持--list缩写

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。