概要
gflagsはGoogleがオープンソースで公開しているコマンドライン引数を処理するためのライブラリです.
C++でコマンドライン引数のフラグを処理するときはgetopt()
を使うのが通説ですが,gflags
を使うとよりフレキシブルに処理することができます.
ここでは,ごく簡単な使い方のみを紹介するので,詳しくはドキュメントを読んでください.
導入
Macならばbrewで一発で入ります.
が,CMake関連のファイルが入らないっぽいので,素直にダウンロードしてビルドします.
gflags自体もcmakeで管理されています.
ダウンロードはこちらから
リンク
CMake
を使えば簡単にリンクできます.
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
find_package (gflags REQUIRED)
include_directories (${gflags_INCLUDE_DIR})
add_executable (hoge main.cc)
target_link_libraries (hoge gflags)
サンプル
テキストファイルに文字列を追加するプログラムを考えます.
実行
./hoge --filename foobar.txt --append_text "aaa"
./hoge --filename foobar.txt --append_text "bbb"
./hoge --filename foobar.txt --read
結果
aaa
bbb
コード
main.cc
# include <gflags/gflags.h>
# include <iostream>
# include <fstream>
# include <string>
//フラグの定義
DEFINE_string(filename, "", "file name to write or read");
DEFINE_bool(read, false, "read file and show text");
DEFINE_string(append_text, "", "append text to the file");
/**
* ファイルの内容を標準出力する
*/
int read_text(const std::string& filename) {
std::ifstream ifs(filename.c_str());
if (!ifs) {
std::cerr << "Failed to open " << filename << std::endl;
return 1;
}
std::string buf;
while (std::getline(ifs, buf)) {
std::cout << buf << std::endl;
}
return 0;
}
/**
* ファイルに文字列を追加する
*/
int append_text(const std::string& filename, const std::string& append_text) {
std::ofstream ofs(filename.c_str(), std::ios::app);
if (!ofs) {
std::cerr << "Failed to open " << filename << std::endl;
return 1;
}
ofs << append_text << std::endl;
return 0;
}
/** メイン関数 */
int main(int argc, char* argv[]) {
// gflagsで定義したフラグを取り除く
gflags::ParseCommandLineFlags(&argc, &argv, true);
int return_value = 0;
//フラグごとの処理
if (!FLAGS_filename.empty()) {
if (FLAGS_read) {
return_value = read_text(FLAGS_filename);
} else {
return_value = append_text(FLAGS_filename, FLAGS_append_text);
}
} else {
std::cerr << "Error: Use --filename flag to give a file name" << std::endl;
return_value = 2;
}
return return_value;
}
超適当な解説
フラグは,以下の6種類あります.
-
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
定義は,大体こんな感じ↓
DEFINE_型(フラグの名前, デフォルトの値, ヘルプの説明)
フラグはFLAGS_フラグの名前
で普通に変数として使えます.
gflags::ParseCommandLineFlags(&argc, &argv,
true)
としておくと,gflags
で定義したフラグをコマンドライン引数から取り除くことができます.なので,getopt
を使っていたコードにgflags
を後で追加した場合でも互換性を保つことが出来るかと思います.
ヘルプは ./hoge --help
で出てきます.
最後に
他にも色々あるけどドキュメント読んでください.