GETOPT_LONG(3) | FreeBSD Library Functions Manual | GETOPT_LONG(3) |
名称
getopt_long, getopt_long_only — コマンドライン引数リストから長いオプションを取得するライブラリ
Standard C Library (libc, -lc)書式
#include < getopt.h> extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;
extern int optreset;
int
getopt_long( int argc, char * const *argv, const char *optstring, const struct option *longopts, int *longindex);
int
getopt_long_only( int argc, char * const *argv, const char *optstring, const struct option *longopts, int *longindex);
解説
getopt_long() 関数は、 getopt(3) と同様ですが、 2 つの形式のオプションを受け付けます: 単語と文字です。 getopt_long() 関数は、 getopt(3) の機能のスーパセット (上位機能) を提供します。 getopt_long() 関数は、2 つの方法で使用することができます。最初の方法では、プログラムで解釈されたあらゆる長いオプションは、対応する短いオプションがあり、オプション構造体は、長いオプションから短いオプションに変換するために使用されるだけです。この方法で使用されるとき、 getopt_long() は、 getopt(3) と同様にに振る舞います。これは、最小の書き直しで既存のプログラムに長いオプション処理を追加する良い方法です。2 番目のメカニズムで、長いオプションは、 option 構造体で渡されたフラグを設定するか、または引数を取るオプションのために option 構造体で渡されたコマンドライン引数へのポインタを格納します。さらに、長いオプションの引数は、例えば次のように、等号との単一の引数として指定できます。
myprogram --myoption=somevalue
長いオプションが処理されるとき、 getopt_long() への呼び出しは、0 を返します。この理由で、ショートカット (手っ取り早い方法) のない長いオプション処理は、 getopt(3) と後方互換性がありません。
いくつかのオプションのために短いオプションと同等物で長いオプション処理という場合には、これらの方法を組み合わせることは、可能です。使用頻繁の少ないオプションは、長いオプションとしてだけ処理されます。
getopt_long() 呼び出しは、長いオプションを記述する構造体が初期化されることを必要とします。構造体は、次の通りです:
struct option { char *name; int has_arg; int *flag; int val; };
name フィールドは、先導する 2 つのダッシュのないオプション名を含むべきです。
has_arg フィールドは、次の 1 つであるべきです:
- no_argument
- オプションへの引数は、予期されません。
- required_argument
- オプションへの引数が必要です。
- optional_argument
- オプションへの引数が提示されるかもしれません。
flag が NULL でないなら、それによって指された整数は、 val フィールドの値に設定されます。 flag フィールドが NULL であるなら、 val フィールドが返されます。 flag に NULL を設定して、対応する短いオプションに val を設定することは、この関数をちょうど getopt(3) のように動作させます。
longindex フィールドが NULL でないなら、それによって指された整数は、 longopts に関連する長いオプションのインデックスに設定されます。
longopts 配列の最後の要素は、0 で満たさなけれなりません。
getopt_long_only() 関数は、長いオプションが‘ --
’に加えて‘ -
’で始まるかもしれないことを除いて、 getopt_long() と同様に振る舞います。‘ -
’で始まるオプションが長いオプションに適合しませんが、単一文字オプションに適合するなら、単一文字オプションが返されます。
戻り値
struct option の flag フィールドが NULL であるなら、 getopt_long() と getopt_long_only() は、通常、ちょうど対応する短いオプションである val フィールドで指定された値を返します。 flag が NULL でないなら、これらの関数は、0 を返して、 flag によって指された位置に、 val を格納します。これらの関数は、オプション引数が欠落しているなら、‘:
’を返し、ユーザが未知の、または、あいまいなオプションを指定したなら、‘
?
’を返し、引数の並びを使い果たしたとき、-1 を返します。
環境変数
- POSIXLY_CORRECT
-
設定されているなら、最初のオプションでないものが見つかったとき、オプション処理は、停止し、
optstring 中の先導する‘
-
’か‘+
’は、無視されます。
使用例
int bflag, ch, fd; int daggerset; /* オプション記述子 */ static struct option longopts[] = { { "buffy", no_argument, NULL, 'b' }, { "fluoride", required_argument, NULL, 'f' }, { "daggerset", no_argument, &daggerset, 1 }, { NULL, 0, NULL, 0 } }; bflag = 0; while ((ch = getopt_long(argc, argv, "bf:", longopts, NULL)) != -1) { switch (ch) { case 'b': bflag = 1; break; case 'f': if ((fd = open(optarg, O_RDONLY, 0)) == -1) err(1, "unable to open %s", optarg); break; case 0: if (daggerset) { fprintf(stderr,"Buffy will use her dagger to " "apply fluoride to dracula's teeth\n"); /* 訳: たくましい女性は、ドラキュラの歯にフッ素を 塗るために短剣を使用する。*/ } break; default: usage(); } } argc -= optind; argv += optind;
実装の差異
このセクションは、glibc-2.1.3 で見つけられる GNU 実装の違いについて説明しています:- flag != NULL で長いオプションのための optopt の設定:
- GNU
- optopt を val に設定します。
- BSD
- ( val を決して返さないので) optopt を 0 に設定します。
- ‘
-W
’ (オプション文字列の‘W;
’) を通して呼び出される引数のない長いオプションのための optarg の設定:- GNU
-
optarg をオプション名 (‘
-W
’の引数) に設定します。 - BSD
- optarg を NULL (長いオプションの引数) に設定します。
- 知られている長いオプション (オプション文字列の‘
W;
’) (への接頭辞) でない引数による‘-W
’の取り扱い:- GNU
-
未知のオプションに設定された
optarg で‘
-W
’を返します。 - BSD
-
エラー (未知のオプション) としてこれを取り扱い、
optopt が 0 に設定され、
optarg が
NULL (GNU のマニュアルページに文書化されているように) に設定され、‘
?
’で返ります。
- BSD は、 GNU が行っているように、呼び出しシーケンスで同じポイントで引数ベクトルの順序を変えません。通常、(-1 が返された後の順序で、現在の位置に関連する optind の値) 呼び出し側によって使用される様子は、同じです。 (私たちは、少ない変数スワップを行います。)
関連項目
getopt(3)歴史
getopt_long() と getopt_long_only() 関数は、 GNU ライブラリではじめて登場しました。 getopt_long() の最初の BSD 実装は、 NetBSD 1.5 で、 getopt_long_only() の最初の BSD 実装は、 OpenBSD 3.3 で登場しました。 getopt_long() は、 FreeBSD 5.0 で、 getopt_long_only() は、 FreeBSD 5.2 で始めて FreeBSD に含まれました。バグ
( POSIXLY_CORRECT が設定されない場合)、要素の順序を変えるかもしれないので argv 引数は、実際に const ではありません。実装は、 getopt(3) を完全に置き換えることができますが、現時点では、私たちは、別のコードを使用しています。
December 25, 2011 | FreeBSD |