gflags使用起來比getopt方便,但是不支持參數的簡寫(例如getopt支持--list縮寫成-l,gflags不支持)。
1.類型
定義gflags的宏:DEFINE_xxxxx(變量名,默認值,help-string) 定義在文件當中(使用全局)
DEFINE_bool
: booleanDEFINE_int32
: 32-bit integerDEFINE_int64
: 64-bit integerDEFINE_uint64
: unsigned 64-bit integerDEFINE_double
: doubleDEFINE_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;
}