argp

Linuxとかのプログラムでコマンドライン引数を解析するための方法として、argpというインターフェースがあります。 glibc (GNU C Library) の中にあります。

 

コマンドライン引数解析は、getopt()およびgetopt_long()を使っても解析できます。 むしろ、こっちのほうが使い方は簡単なような気がします。

 

しかし、getopt()などよりも argp のほうが(マニュアルによると?)色々できてメンテが楽らしいので、これから argp を試してみたいと思います。

 

最初のプログラム

これで一応動くらしい。

 

#include <stdlib.h>
#include <argp.h>

 

int main(int argc, char *argv)
{

    argp_parse(NULL, argc, argv, 0, NULL, NULL);
    exit(0);
}

 

 

このプログラムは何もしませんが、コマンドラインから --help オプションは機能します。 以下のように実行するとヘルプメッセージが表示されるはずです。

 

$  ./test1  --help

 

一般的なコマンドの cat とか ls でも --help を付けて実行するとヘルプメッセージが表示されますが、それらと同じものが argp ではすでに内蔵されているのです。

 

--version オプション(バージョン情報を表示するオプション)も使えるようにするには、グローバル変数 argp_program_version を定義して、表示する文字列を代入するだけです。 あと、--help オプションのヘルプメッセージで、バグ報告用のアドレスを付け加えるには、同様にグローバル変数 argp_program_bug_address を定義し文字列を代入するだけです。 これらを設定したプログラムは以下のようになります。

 

#include <stdlib.h>
#include <argp.h>

 

const char *argp_program_version = "Ver1.0.0";
const char *argp_program_bug_address = "foo@bar.baz";

 

int main(int argc, char *argv)
{
     argp_parse(NULL, argc, argv, 0, NULL, NULL);
     exit(0);
}

 

 

 なんで、グローバル変数宣言しただけで機能してるのかは知りませんが、これで良いそうです(たぶん、weak symbol ってやつかな?)。