Heavy Watal

C++コマンドライン引数

理想

GNU getopt

https://www.gnu.org/s/libc/manual/html_node/Getopt.html

boost::program_options

https://www.boost.org/doc/html/program_options.html

gflags

https://gflags.github.io/gflags/

Usage

main() 関数に書く必要があるのはこれだけ

#include <gflags/gflags.h>

int main(int argc, char* argv[]) {
    gflags::SetUsageMessage("This is a program to test gflags");
    gflags::ParseCommandLineFlags(&argc, &argv, true);
    // do something
    return 0;
}

あとは個々のソースファイルでオプションを追加。namespace にも入れられる。

#include <gflags/gflags.h>

namespace tapiola {
    DEFINE_uint64(sibelius, 0, "string that is displayed with --help flag");
}

void func(){
    std::cout << tapiola::FLAGS_sibelius << std::endl;
}

cmdline

https://github.com/tanakh/cmdline
http://d.hatena.ne.jp/tanakh/20091028

TCLAP

http://tclap.sourceforge.net/

getoptpp

http://code.google.com/p/getoptpp/

clipp

https://github.com/muellan/clipp

理念がしっかりしていて、かなり柔軟に使える。

そのまま使うには少し難しかったり、 値を一括して取得する機能が欠けたりという問題はある。
nlohmann/json を使ってそのへんをうまくやる補助ライブラリ clippson を作って利用中。

そのほか

Githubで上位に出てくるこれらもそのうち試したい:

https://github.com/docopt/docopt.cpp
ヘルプを自動生成するのではなく、ヘルプからパーサを構築する
元々はPython用に作られ、それから多言語に移植されてる実績
boolstd::stringでゲットするしかないので、手動でキャストして代入
std::vector<std::string>から読める
要ビルド&リンク (header-only化しようとしてる雰囲気はある)
https://github.com/jarro2783/cxxopts
Lightweight C++ command line option parser
parse(argc, argv) だけ
https://github.com/Taywee/args
名前空間が args という大胆さ
同じ名前を何回も書かなきゃいけないような、少々やぼったいインターフェイス
ヘッダ1つ、ヘルプ自動生成なのは良い
https://github.com/adishavit/argh
A minimalist argument handler.
ハイフンの数を区別できないし、ヘルプ自動生成も無い。