谷歌的gflags(ZZ)

http://liuxun.org/blog/gu-ge-de-gflags/

Google gflags官方文档:http://google-gflags.googlecode.com/svn/trunk/doc/gflags.html

大家一定用过也写过很多的命令程序,有一类命令行程序是形如这样的“cmd –arg1=arg –args=arg”,要做到这点一种方法是自己写个程序去解析这种命令行形式。

但其实可以更简单,更高效,更安全,推荐使用谷歌的gflags。 gflags可以在google code上下载,项目主页为http://code.google.com/p/google-gflags/。下载安装都跟普通的linux程序差不多,当然windows下也应该是可以使用的。

用起来也很简单,首先是包含gflags.h头文件,然后在main方法中调用google::ParseCommandLineFlags(&argc, &argv, true),这样就可以解析到命令行传递过来的参数。

在程序中定义参数可以用到DEFINE_开头的宏,比如你要定义个bool比变量is_run,可以使用如下语句:

1
DEFINE_bool(is_run, false, “is run”);

定义了一个bool变量,默认值是false,最后一个参数“is run”是对这个变量的描述。

定义字符串用DEFINE_string,定义int用DEFINE_int32,还有DEFINE_int64和DEFINE_uint64。

如何在程序中使用这些变量呢?FLAGS_is_run这样的格式就可了。到要是在定义的其他文件中使用这些参数呢?那需要用到DECLARE_宏了,想到于声明了一个extern变量。

那在命令行上如何使用呢?一开始就说过了。还拿那个is_run的例子,可以传递参数—is_run=true。

基本用法:
1.首先要定义变量,定义方法如下:
参数依次是: 变量名, 默认值,说明

DEFINE_bool(test_bool, false, “tests bool-ness”);
DEFINE_int32(test_int32, -1, “”);
DEFINE_int64(test_int64, -2, “”);
DEFINE_uint64(test_uint64, 2, “”);
DEFINE_double(test_double, -1.0, “”);
DEFINE_string(test_string, “initial”, “”);
2. 定义后就可以使用了,使用方法
FLAGS_test_bool 当作bool值用
FLAGS_test_int32 当作int32值用
……
当然,这个变量还可以赋值
FLAGS_test_int32 = 100;

3.  如何在命令行传入非默认值
a. 首先在程序内解析命令行参数
google::ParseCommandLineFlags(&argc, &argv, false);

b.运行程序时要传入定义的参数
./ext –test_int32=200

然后你就可以把FLAGS_test_int32按200的值使用了

4.gtest中的使用
为什么单提了这个?
因为我原来一直以为,gtest的main函数中
testing::InitGoogleTest(&argc, argv);
已经解析了所有命令行参数,其实….根本不是!
gtest中必须按照这个个顺序调用:

testing::InitGoogleTest(&argc, argv);
google::ParseCommandLineFlags(&argc, &argv, false);
前者只解析gtest自己需要的参数,后者才会解析你定义的;如果顺序反了,会产生ERROR: unknown command line flag ‘gtest_output’. 因为这时gtest定义的参数还不存在,它不认gtest程序默认传入的gtest_output参数。

原文地址:https://www.cnblogs.com/sure/p/3782790.html