如何安裝使用gflags:
- 首先需要include "gflags.h"(廢話,-_-b)
#include <gflags/gflags.h>
- 將需要的命令行參數使用gflags的宏:DEFINE_xxxxx(變量名,默認值,help-string) 定義在文件當中,注意全局域哦。gflags支持以下類型:
DEFINE_bool
: booleanDEFINE_int32
: 32-bit integerDEFINE_int64
: 64-bit integerDEFINE_uint64
: unsigned 64-bit integerDEFINE_double
: doubleDEFINE_string
: C++ string
- 在main函數中加入:(一般是放在main函數的頭幾行,越早了解用戶的需求越好麼^_^)
google::ParseCommandLineFlags(&argc, &argv, true);
argc和argv想必大家都很清楚了,說明以下第三個參數的作用:
如果設爲true,則該函數處理完成後,argv中只保留argv[0],argc會被設置爲1。
如果爲false,則argv和argc會被保留,但是注意函數會調整argv中的順序。
- 這樣,在後續代碼中可以使用FLAGS_變量名訪問對應的命令行參數了
printf("%s", FLAGS_mystr);
- 最後,編譯成可執行文件之後,用戶可以使用:executable --參數1=值1 --參數2=值2 ... 來爲這些命令行參數賦值。
./mycmd --var1="test" --var2=3.141592654 --var3=32767 --mybool1=true --mybool2 --nomybool3
這裏值得注意的是bool類型命令行參數,除了可以使用--xxx=true/false之外,還可以使用--xxx和--noxxx後面不加等號的方式指定true和false
- 在其他文件中使用定義的flags變量:有些時候需要在main之外的文件使用定義的flags變量,這時候可以使用宏定義DECLARE_xxx(變量名)聲明一下(就和c++中全局變量的使用是一樣的,extern一下一樣)
DECLARE_bool
: booleanDECLARE_int32
: 32-bit integerDECLARE_int64
: 64-bit integerDECLARE_uint64
: unsigned 64-bit integerDECLARE_double
: doubleDECLARE_string
: C++ string在gflags的doc中,推薦在對應的.h文件中進行DECLARE_xxx聲明,需要使用的文件直接include就行了。
- 檢驗輸入參數是否合法:gflags庫支持定製自己的輸入參數檢查的函數,如下:
static bool ValidatePort(const char* flagname, int32 value) { if (value > 0 && value < 32768) // value is ok 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 = RegisterFlagValidator(&FLAGS_port, &ValidatePort);
- 判斷flags變量是否被用戶使用:在gflags.h中,還定義了一些平常用不到的函數和結構體。這裏舉一個例子,判斷參數port有沒有被用戶設定過
google::CommandLineFlagInfo info;
if(GetCommandLineFlagInfo("port" ,&info) && info.is_default) {
FLAGS_port = 27015;
} - 定製你自己的help信息與version信息:(gflags裏面已經定義了-h和--version,你可以通過以下方式定製它們的內容)
- version信息:使用google::SetVersionString設定,使用google::VersionString訪問
- help信息:使用google::SetUsageMessage設定,使用google::ProgramUsage訪問
- 注意:google::SetUsageMessage和google::SetVersionString必須在google::ParseCommandLineFlags之前執行
- https://code.google.com/p/gflags/
- https://gflags.googlecode.com/git-history/master/doc/gflags.html#flagfiles