,,C++命令行解析包gflags的使用教程

,,C++命令行解析包gflags的使用教程

本文主要介绍C命令行解析包gflags的使用教程。通过示例代码非常详细的介绍,对大家的学习或者工作都有一定的参考价值。有需要的朋友就跟着下面的边肖学习吧。

目录

安装介绍

例子

使用精化来定义参数

参数分析

用于参数验证的参数

检查参数是否已设置。

文件介绍

引入环境变量

在程序中指定

完整示例

其他通用参数

自定义版本和帮助信息

CMake使用

整数选择

其他的

涉及

前言

Gflags是Google提供的命令行参数处理开源库,现在已经独立开源。它比传统的getopt()更强大,可以将不同的参数定义分发给各种源文件,无需集中管理。

有C和Python两个版本。这里只详细介绍C版本的使用。

简介

配置参数是分开管理还是集中管理,没有严格的约束,关键看项目中的统一规范。但是,gflags可以支持这两种方式,允许用户更灵活地使用它们。

当参数分布到各个源文件时,如果定义了相同的参数,编译时会直接报错。

固定

许多发行版都有自己的开发库。下面简单介绍一下使用CMake从源代码编译。源代码可以从GitHub gflags版本中选择。

以下命令以最新版本2.2.2为例。

$ tar xzf gflags-2.2.2.tar.gz

$ cd gflags-2.2.2

$ mkdir构建cd构建

$ cmake-DC make _ INSTALL _ PREFIX=/usr.

$ make

$ make test #单元测试,执行cmake时需要添加-DBUILD_TESTING=true参数。

# make install #安装,一般需要root用户来执行。

默认情况下,它将安装在/usr/local目录中。您需要配置动态库、头文件路径等。通过上面提到的-DCMAKE_INSTALL_PREFIX=/usr参数修改这个路径,使用系统默认路径。此时,将安装以下文件。

/usr/lib/libgflags.a

/usr/lib/libgflags_nothreads.a

/usr/include/gflags/gflags.h

/usr/include/gflags/gflags _ declare . h

/usr/include/g flags/g flags _ completions . h

/usr/include/gflags/gflags _ gflags . h

/usr/lib/cmake/gflags/gflags-config . cmake

/usr/lib/cmake/gflags/gflags-config-version . cmake

/usr/lib/cmake/gflags/gflags-targets . cmake

/usr/lib/cmake/gflags/gflags-targets-release . cmake

/usr/lib/cmake/gflags/gflags-nonamespace-targets . cmake

/usr/lib/cmake/gflags/gflags-nonamespace-targets-release . cmake

/usr/bin/gflags_completions.sh

/usr/lib/pkgconfig/gflags.pc

详细安装请参考gflags install.md中的介绍可以使用ccmake选择配置项,也可以使用上述cmake参数进行配置。

例子

假设有一个网络客户端代码,需要指定服务器的地址和端口,希望有默认的参数,同时允许用户通过命令行指定不同的值。

#包括iostream

#包含gflags/gflags.h

DEFINE_string(主机,' localhost ','服务器主机地址');

DEFINE_int32(端口,8080,'服务器端口');

int main(int argc,char **argv)

{

gflags:ParseCommandLineFlags(argc,argv,true);

' std:cout '获取了' ' FLAGS_host ':' FLAGS_port ' '。'STD:endl;

返回0;

}

代码开头通过DEFINE_XXX定义参数,包括变量名、默认值、参数引入等。在主程序中,使用gflags:ParseCommandLineFlags()函数解析参数;使用时,只需在变量名前添加FLAGS_ header即可。

通过下面的命令行编译。

g main . cc-STD=c 11-o g flags-LG flags-LP thread

默认情况下,pthread线程库是必需的。不使用多线程时,不确定如何关闭该参数。

然后,您可以按如下方式指定参数。

-不指定参数,使用默认值。

$ ./gflags

得到“本地主机:8080”。

-您可以选择指定一个或多个参数。

$ ./gflags-宿主www.foobar.com

得到了‘www . foobar . com:8080’。

$ ./gflags-端口80

获得“本地主机:80”。

$ ./gflags-主机www.foobar.com-端口80

得到了‘www . foobar . com:80’。

-同时支持不同的参数指定方法。

$ ./gflags -主机www.foobar.com-端口80

得到了‘www . foobar . com:80’。

$ ./gflags - host=www.foobar.com=-端口80

得到了‘www . foobar . com:80’。

同时,还可以使用- help参数查看帮助信息,包括gflags库提供的参数和用户提供的参数。以下是输出用户参数信息。

main.cc中的标志:

-host(服务器主机地址)类型:字符串默认值:“localhost”

-port(服务器端口)类型:int32默认值:8080

然后看详细用法。

使用的详细说明

包含如何定义、解析等使用场景。

定义参数

上例定义了两类参数,string string和integer int32,包括变量名、默认值和参数引入。这三个参数都是必需的。

Gflags总共提供了六个定义(或类型)。

DEFINE_bool布尔值

DEFINE_int32 32位整数

DEFINE_int64 64位整数

DEFINE_uint64无符号64位整数

定义_double double

定义字符串C字符串

它可以在某个名称空间下定义,因此必须与名称空间前缀一起使用。如果在不同的文件中定义,可以在某个集合的头文件中用DECLARE_XXX(VAR)声明。

注意,不要用相同的名称定义参数,即使在不同的名称空间中;有几个保留参数,包括env的标志文件tryfromenv等等。

参数分析

在上面的例子中,参数是由ParseCommandLineFlags()函数解析的,也有一种不需要帮助文档的解析方法。这两个函数的声明如下。

uint 32 ParseCommandLineFlags(int * argc,char*** argv,bool remove _ flags);

uint 32 ParseCommandLineNonHelpFlags(int * argc,char*** argv,bool remove _ flags);

其中remove_flags标识指定参数的处理方法。如果为真,解析时会从argv中删除flag及其对应的值,并修改argc,即存储最后一个不包含flag的参数;如果为false,则只重新排列参数,并将标志参数放在第一位。

参数校验

要检查参数的值是否合法,可以为某个参数注册一个验证函数。当参数被解析或修改时(调用SetCommandLineOption()时),将调用验证函数。如果返回true,验证将成功,否则将失败。

下面是端口参数的验证。

#包括iostream

#包含gflags/gflags.h

DEFINE_string(主机,'本地主机','服务器主机地址。');

DEFINE_int32(端口,8080,'服务器端口。');

静态bool validate port(const char * flag,gflags:int32 value)

{

if(值0值32768)

返回true

“std:cerr”的值对“flag”:“value STD:endl”无效;

返回false

}

static const bool port _ dummy=gflags:RegisterFlagValidator(FLAGS _ port,ValidatePort);

int main(int argc,char **argv)

{

gflags:ParseCommandLineFlags(argc,argv,true);

STD:cout ' get ' ' FLAGS _ host ':' FLAGS _ port ' ' ' STD:endl;

返回0;

}

如果超出指定范围,将会报告错误。

使用参数

默认帮助用于查看帮助信息。指定的参数可以使用-或-符号,参数和值的划分可以使用``或=,如上例所示。

对于布尔类型,也可以使用-foobar-no foobar-foobar=true-foobar false来指定它们。

检查参数是否已设置。

参数被ParseCommandLineFlags()函数解析后,可以通过以下方法检查对应的变量是否被设置。

gflags:CommandLineFlagInfo信息;

if(g flags:GetCommandLineFlagInfo(' port ',info) info.is_default) {

未设置std:cout端口。STD:endl;

}否则{

std:cout '端口已设置。STD:endl;

}

这里,不直接比较的设置值与默认值相同。即使指定了与默认值相同的值,也将认为该参数已被修改。

文件介绍

您可以通过- flagfile=FileName指定参数文件名,也可以使用通配符*和?在文件中每行标识一个参数,例如:

$ cat flags.txt

#这是测试服务器。

- host=www.foobar.com

-端口=80

$ ./gflags - flagfile flags.txt

得到了‘www . foobar . com:80’。

以#开头的注释也可以再次使用- flagfile=FileName包含一个参数配置文件。

引入环境变量

可以使用-fromenv或- tryfromenv从环境变量中引入参数,也可以指定由-fromenv=foo,bar读取的参数。当然,您需要首先设置环境变量。

export FLAGS _ foo=xxxexport FLAGS_bar=yyy # sh

setenv FLAGS _ foo xxxsetenv FLAGS_bar yyy # tcsh

这相当于在命令行上指定-foo=XXX-bar=yyy参数。

其中,如果环境变量不存在,则- fromenv将报告错误,如果环境变量不存在,则- tryfromenv将使用默认值。

在程序中指定

最常见的是允许用户动态配置,也就是动态加载,可以通过调用SetCommandLineOption()函数来实现,其声明如下。

STD:string setcommandline option(const char * name,const char * value);

比如说。

gflags:SetCommandLineOption(' port ',' 9999 ');

将成功返回端口设置为9999的字符串,否则将返回空字符串。

另外,还可以通过bool getcommandline option(const char * name,std: string * OUTPUT)函数获取flag的接口。如果未指定,将通过输出返回默认值,只有在指定了未定义的标志名时,才会返回false。

可以使用if (FLAGS_foo)进行正常读写;FLAGS_Foo=bar,但是如果需要线程安全调用,建议使用这两个函数。

完整示例

上述设置的完整示例如下。

#包括iostream

#包含gflags/gflags.h

DEFINE_string(主机,'本地主机','服务器主机地址。');

DEFINE_int32(端口,8080,'服务器端口。');

静态bool validate port(const char * flag,gflags:int32 value)

{

if(值0值32768)

返回true

“std:cerr”的值对“flag”:“value STD:endl”无效;

返回false

}

static const bool port _ dummy=gflags:RegisterFlagValidator(FLAGS _ port,ValidatePort);

int main(int argc,char **argv)

{

gflags:SetVersionString(' 1 . 1 . 0 ');

gflags:SetUsageMessage('。/gflags ');

gflags:ParseCommandLineFlags(argc,argv,true);

STD:cout g flags:setcommandline option(' port ',' 999 ')STD:endl;

STD:cout ' get ' ' FLAGS _ host ':' FLAGS _ port ' ' ' STD:endl;

返回0;

}

可以用命令gmain . cc-STD=c11-o g flags-LG flags-LP thread编译。

其他的

常用参数

GFS中有几个默认参数。

- help显示所有文件的所有标志,按文件和名称排序,并显示标志名称、默认值和帮助。

- helpfull与- help相同,显示所有标志。

- helpshort只显示执行文件中包含的标志,通常是main()所在的文件。

- helpxml类似于-help,但输出是xml。

- helpon=FILE仅显示文件中定义的标志。*

-helpmatch=s仅显示在*S*中定义的标志。*

- helppackage在与main()相同的目录中显示文件中的标志

- version打印执行文件的版本信息。

-undef ok=flagname,flagname,后面列出的标志名可以被忽略,没有任何定义,也不会报告错误。

- fromenv - tryfromenv从环境变量引入。

-从文件中引入flagfile。

自定义版本和帮助信息

通过- version和- help,默认会输出相应的版本和帮助信息。也可以通过SetVersionString()设置版本信息,通过SetUsageMessage()设置帮助的启动软件信息(帮助信息不能被覆盖)。

gflags:SetVersionString(' 1 . 1 . 0 ');

gflags:SetUsageMessage('。/gflags ');

注意,参数的设置需要在调用ParseCommandLineFlags()之前完成。

CMake使用

最新版本的gflags已经可以支持CMake了。如上图安装所示,安装时相关文件会安装在/usr/lib/cmake/gflags/目录下,所以可以在项目中使用如下。

FIND_PACKAGE(需要gflags)

包含目录(${gflags_INCLUDE_DIR})

添加可执行文件(foo main.cc)

目标_链接_库(foo gflags)

如果CMake安装在另一个路径中,可以将上述文件复制到CMake的模块路径中重复使用。

整数选择

在gflags/gflags_declare.h中定义了int32 int64等类型,可以直接使用,但编译时需要添加-std=c 11参数,否则使用cstdint头文件时会报错。

其他的

可以通过void getall flags(STD:vectorcommandlineflaginfo * output)接口遍历所有参数。更多接口,可以查看gflags/gflags.h头文件。

涉及

可以详细查看官方文档中关于如何使用gflags的介绍。

就是这样。本文介绍了使用C命令行解析包gflags的教程。有关使用C命令行解析包gflags的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • vs2015打包安装程序,vs2015程序打包,VS2022实现VC++打包生成安装文件图文详细历程
  • vc++6.0的快捷键,vc 快捷键
  • vc++6.0的快捷键,vc 快捷键,VC6.0常用快捷键大全
  • 绘制圆角矩形的方法,c++ 画矩形,C#画圆角矩形的方法
  • 懒汉式和饿汉式代码,单列模式懒汉和饿汉,C++单例模式的懒汉模式和饿汉模式详解
  • 好用的C++编译器,c++编译软件哪个好
  • semaphore c#,c++ semaphore
  • semaphore c#,c++ semaphore,C++中Semaphore内核对象用法实例
  • dev-c++使用教程,dev c++安装教程
  • dev-c++使用教程,dev c++安装教程,Dev C++ 安装及使用方法(图文教程)
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针
  • C里面指针常量和常量指针的区别,c++指针常量和常量指针,简单总结C++中指针常量与常量指针的区别
  • com组件初始化失败,c#开发com组件,C++中COM组件初始化方法实例分析
  • c++静态成员变量使用,c++静态成员函数和静态成员变量
  • c++静态成员变量使用,c++静态成员函数和静态成员变量,详解c++ 静态成员变量
  • 留言与评论(共有 条评论)
       
    验证码: