gflags-命令行参数处理

gflags

gflags是Google开源的一套命令行参数处理的开源库,可以方便高效的处理命令参数。

参数解析

int main(int argc, char** argv){...}

main()函数参数信息保存在argc, argv中,需要遍历解析,为了处理方便,参数的顺序还会有明确的要求。使用gfalgs可以省略解析部分代码,通过调用ParseCommandLineFlags()即完成了参数的解析。

//该函数是解析命令行参数的,所以调用应该在main()入口处。
google::ParseCommandLineFlags(&argc, &argv, true);

gflags是如何解析参数的?

  1. 程序中需要定义参数名,让程序知道需要识别哪些参数。 如定义一个name参数:
DEFINE_string(name, "Catherine", "this parameter is a name.");
  1. 执行命令时,需要指定参数格式: --name="William"
  2. 调用ParseCommandLineFlags()完成解析,name参数值将保存在全局变量FLAGS_name中。

参数的定义

gflags支持的类型定义方法:

方法名:定义参数的类型
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

DEFINE_xxx方法有三个参数:

  1. 参数名
  2. 默认值(命令执行时未指定参数时,参数值为默认值)
  3. 参数描述
DEFINE_string(name, "Catherine", "this parameter is a name.");

参数的使用

解析后,即可使用全局变量:FLAGS_+参数名,如FLAGS_name

如果需要在其他文件(非参数定义的文件)中使用,需要在文件中使用DECLARE_xxx()声明该参数。

//声明方法DECLARE_xxx,xxx类型和参数名要和定义一致,参数只有1个:参数名
DECLARE_string(name)

参数解析的第三参数

google::ParseCommandLineFlags(&argc, &argv, true);

第三个参数为remove_flags,标识解析后,是否要从参数列表中移除。
true:参数信息中将删除gflags相关参数,只保留不是gflags定义的参数。
false:不删除gflags参数,顺序会改变。

一般参数解析后,也没有保留的必要,设置为true就好了。

辅助函数

对于常用的版本和帮助提供了接口设置:
设置版本信息:google::SetVersionString(string);
设置帮助信息:google::SetUsageMessage(string);

执行时制定参数即可
–version:显示版本信息。
–help:显示所有帮助信息,包括自定义的帮助信息和gflags本身的帮助信息。
–helpshort:显示自定义的帮助信息。

例子

#include <gflags/gflags.h>
#include <iostream>
#include <string>

DEFINE_string(para1, "para1", "the first parameter.");
DEFINE_bool(para2, true, "the secode parameter.");

static std::string VersionInfo = "Verion 1.0";
static std::string HelpInfo = "This is help info.";


int main(int argc, char** argv) {
	google::SetVersionString(VersionInfo);
	google::SetUsageMessage(HelpInfo);
	google::ParseCommandLineFlags(&argc, &argv, true);	

    std::cout << "para1 = " << FLAGS_para1 << std::endl;
	std::cout << "para2 = " << FLAGS_para2 << std::endl;

	return 0;
}

输出

默认参数

$ ./a.out
para1 = para1
para2 = 1

指定参数

$ ./a.out --para1="mytest" --para2=false
para1 = mytest
para2 = 0

–helpshort

$ ./a.out --helpshort
.out: This is help info.

–version

$ ./a.out --version
a.out version Verion 1.0
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个问题可能与 gflags 库中的字符串转义机制有关。 在 gflags 中,字符串参数会被解析成 C++ 字符串类型,但是在命令参数传递过程中,需要使用引号将字符串参数括起来。如果在命令中传递了带有引号的字符串参数,那么在解析过程中可能会出现转义字符的问题。 例如,假设在命令中传递了如下字符串参数: ``` --my_string_param="hello world" ``` 在 gflags 中解析后,该参数的值应该是一个 C++ 字符串类型的变量,值为 "hello world"。但是如果在命令中传递的参数中包含了转义字符,例如: ``` --my_string_param="hello \"world\"" ``` 那么在解析过程中,转义字符 "\" 可能会被保留,导致最终解析出的字符串参数值为 "hello \"world\""。这可能就是你遇到的问题。 为了避免这种情况,建议在命令中传递字符串参数时不要使用转义字符。如果必须使用转义字符,可以在代码中手动去除转义字符。 ### 回答2: gflags是一个用于解析命令参数的库,它可以帮助我们在命令中传递参数,并根据我们的需要将其解析为相应的类型。在解析string类型参数时,如果我们的参数值中包含了引号,则gflags会自动将其转义。 假设我们在命令中传递了一个string类型的参数"s",其值为"s",在gflags中解析这个参数时,由于参数值中的引号是特殊字符,会引起转义。转义后的结果就是在引号的前面加上一个反斜杠"\”,即变成了"\"s\""。 这个转义过程是为了保证参数值在被解析后能够正确地表示出原始的含义。反斜杠是一种转义字符,用于转义特殊字符,使其具有特殊的含义。在这个例子中,由于引号是一种特殊字符,如果不进转义,那么在解析后的结果中,无法正确地表示出原始的参数值。 所以,gflags在解析string类型参数时,会将参数值中的引号进转义,将其转化为"\"s\""的形式。这样一来,在程序中就可以正确地将参数值作为一个string类型的变量使用了。 总结起来,gflags解析string参数"s"变成"\"s\""是为了保证参数值的正确解析,并能在程序中以正确的形式使用。 ### 回答3: gflags是一个用于处理命令参数的开源库。当我们使用gflags解析参数时,有时候我们想要将字符串参数包含在引号内,或者让它们以某种方式被转义。 要将字符串参数"s"解析为"\"s\"",我们可以使用以下方法: 1. 在代码中使用gflags库的方法来解析命令参数。假设我们有一个string类型的变量s,我们可以使用gflags::ParseCommandLineFlags()方法来解析命令参数并将其赋值给变量s。 2. 在命令中以引号包围字符串参数"s",并使用gflags解析。例如,在命令中输入--s=\"s\"。这样,gflags会将输入的字符串参数解析为"\"s\"",即在字符串前后添加转义字符"\"。 3. 在程序中手动将字符串参数"s"添加转义字符"\"。这种方法适用于不使用命令参数解析的情况。在代码中,我们可以将字符串参数"s"改为"\"s\"",然后使用它。 总之,gflags可以根据我们的需要来解析和处理字符串参数。通过使用引号包围参数或手动添加转义字符,我们可以将字符串参数"s"解析为"\"s\""。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值