Google命令行工具gflags使用

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章