Googleの使いやすいgFlags解析コマンドラインパラメータ(C ++およびPythonをサポート)

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_menuFLAGS_languages2つの変数で定義されています。一般的な変数のように読み書きできます:

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そして、この関数は値を変更するためargvmain入り口パラメーターはポインターに渡されます。
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/

おすすめ

転載: blog.csdn.net/lianshaohua/article/details/108646664
おすすめ