Heavy Watal

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

理想

GNU getopt

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

boost::program_options

http://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/

そのほか

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

https://github.com/docopt/docopt.cpp
ヘルプを自動生成するのではなく、ヘルプからパーサを構築する
元々はPython用に作られ、それから多言語に移植されてる実績
boolstd::stringでゲットするしかないので、手動でキャストして代入
std::vector<std::string>から読める
要ビルド&リンク (header-only化しようとしてる雰囲気はある)
https://github.com/jarro2783/cxxopts
コンストラクタが(argc, argv)しかない
-j3-j 3 じゃなくて --j3 と解釈されてしまう
https://github.com/Taywee/args
名前空間がargsという大胆さ
同じ名前を何回も書かなきゃいけないような、少々やぼったいインターフェイス
ショートオプションを定義できないバグ?
ヘッダ1つ、ヘルプ自動生成なのは良い
https://github.com/weisslj/cpp-argparse
名前のとおり Python argparse インスパイア系
でもところどころまだ optparse の名残が…?
要ビルド&リンク