1.はじめに
GFlagsは、C ++バージョンとpythonバージョンを含む、Googleがオープンソース化したコマンドラインパラメータ処理用のオープンソースライブラリのセットです。
getopt()などのライブラリとは異なり、フラグ定義はまとめるのではなく、さまざまなソースコードに分散させることができます。ソースファイルは独自のフラグのいくつかを定義でき、ファイルにリンクするアプリケーションはこれらのフラグを使用できます。これにより、コードの再利用が容易になります。異なるファイルが同じフラグを定義している場合、リンク時にエラーが報告されます。
2、プログラムでフラグを定義する
フラグの定義は簡単です。使用するタイプの対応するマクロを使用するだけです。
例:
// foo.cc
#include <gflags/glags.h>
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_bool:ブール値
- DEFINE_int32:32ビット整数
- DEFINE_int64:64ビット整数
- DEFINE_uint64:符号なし64ビット整数
- DEFINE_double:double
- DEFINE_string:C ++文字列
DEFINEマクロには、フラグ名、デフォルト値、メソッドの説明の3つのパラメーターが含まれています。--helpフラグを実行すると、ヘルプが表示されます。
フラグは任意のソースファイルで定義できますが、各フラグは一度だけ定義できます。複数の場所で使用する必要がある場合は、1つのファイルでDEFINE、他のファイルでDECLAREを使用します。より良い方法は、.ccファイルでDEFINEし、.hファイルでDECLAREすることです。これにより、ヘッダーファイルをインクルードする場合にフラグを使用できます。
3、使用フラグ
フラグは、通常のように変数の使用として定義できFLAGS_
、接頭辞を付けます。前の例FLAGS_big_menu
とFLAGS_languages
2つの変数で定義されています。一般的な変数のように読み書きできます:
if (FLAGS_consider_made_up_languages)
FLAGS_languages += ",klingon"; // implied by --consider_made_up_languages
if (FLAGS_languages.find("finnish") != string::npos)
HandleFinnish();
4、すべてのパラメーターを初期化する
パラメーターを定義したら、最後に、executorにコマンドラインから渡されたパラメーターを処理して、定義されたFLAGパラメーターが正しく割り当てられるようにします。
通常はmain()
関数で呼び出されます
google::ParseCommandLineFlags(&argc, &argv, true);
argc
そして、この関数は値を変更するためargv
、main
入り口パラメーターはポインターに渡されます。
3番目のパラメータはと呼ばれremove_flags
ます。そうである場合はtrueに、ParseCommandLineFlags
それからなりargv
除去し、その識別パラメータ対応する減少argc
値。その後argv
、コマンドラインパラメータのみが保持されます。
それどころか、それは場合remove_flags
ではfalse、それがParseCommandLineFlags
残るargc
変わらないが、ロゴが手前になるように、彼らのためには、再調整されます。
注: ./foo --big_menu=false arg1
中央big_menu
はロゴ、false
そのパラメーター、およびarg1
コマンドラインパラメーターです。
5、特別な標識
--help shows all flags from all files, sorted by file and then by name; shows the flagname, its default value, and its help string
--helpfull same as -help, but unambiguously asks for all flags (in case -help changes in the future)
--helpshort shows only flags for the file with the same name as the executable (usually the one containing main())
--helpxml like --help, but output is in xml for easier parsing
--helpon=FILE shows only flags defined in FILE.*
--helpmatch=S shows only flags defined in *S*.*
--helppackage shows flags defined in files in same directory as main()
--version prints version info for the executable
6、サンプルコード
最初にgflagsコードをダウンロードしてから、ビルドしてインストールする必要があります
main.cpp
#include <iostream>
#include <gflags/gflags.h>
DEFINE_string(data_path,"./config/","data path");
DEFINE_string(config_path,"./data/","config path");
DEFINE_bool(is_check,false,"check flag");
using namespace std;
int main(int argc,char *argv[])
{
google::SetUsageMessage("usage:");
google::ParseCommandLineFlags(&argc,&argv,true);
cout<<"argc="<<argc<<endl;
cout<<"data_path="<<FLAGS_data_path<<endl;
cout<<"config_path="<<FLAGS_config_path<<endl;
cout<<"is_check="<<FLAGS_is_check<<endl;
return 0;
}
ビルドコマンド:
g++ -Wall -g main.cpp -o main -I/usr/local/include/gflags -lgflags -lpthread
実行結果:
より詳細な情報:
1、github:https : //github.com/gflags/gflags
2.公式ドキュメント:https : //gflags.github.io/gflags/