LoginSignup
21
16

More than 5 years have passed since last update.

gflagsでコマンドライン引数を処理する

Last updated at Posted at 2014-08-26

概要

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で出てきます.

最後に

他にも色々あるけどドキュメント読んでください.

21
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
16