#include <unistd.h>
int getopt(int argc, char * const argv[],
           const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
#include <getopt.h>
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);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
getopt():
_POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE
getopt_long(),
getopt_long_only():
_GNU_SOURCE
 
変数 optind は、 argv の次に処理される要素のインデックスである。 システムによりこの変数の値は 1 に初期化される。 呼び出し側でこの値を 1 にリセットすることで、同じ argv のスキャンをやり直したり、新しい引き数ベクトルをスキャンすることができる。
新たなオプション文字を見つけると、 getopt() はその文字を返し、 外部変数 optind とスタティックな変数 nextchar を更新する。 これらによって、 getopt() は次回の呼び出しの際に、 以降のオプション文字や argv 要素のスキャンを継続できる。
オプション文字がそれ以上見つからなくなると、 getopt() は -1 を返す。そして optind は、argv の要素のうち、 オプションでない最初の要素を示すようになる。
optstring は受け付けるオプション文字からなる文字列である。 文字のあとにコロン (:) が置かれている場合は、 オプションには引き数が必要であることを示す。 このとき getopt() は、現在注目している argv 要素で、オプション文字に引き続くテキストへのポインタか、 あるいは次の argv 要素のテキストへのポインタを optarg に代入する。 2 個連続してコロンが置かれている場合は、 そのオプションは引き数をとってもとらなくてもよい。 現在の argv 要素にテキストがあれば (つまり、"-oarg" のように、オプション名自身と同じワード内に テキストがある場合)、それが optarg に返される。 なければ optarg は 0 に設定される。 これは GNU による拡張である。 optstring に W とそれに続くセミコロンが入っていると、 -W foo は長いオプション --foo と同じように扱われる (POSIX.2 は -W オプションを実装依存の拡張として予約している)。 この動作は GNU による拡張であり、glibc 2 以前のライブラリでは 利用できない。
デフォルトでは getopt() は argv をスキャンする際に順序を変更し、 オプション以外の要素を最後に移動する。 他にも 2 つのモードが実装されている。 optstring の先頭文字が aq+aq であるか、環境変数 POSIXLY_CORRECT が設定されている場合には、オプションを対象とする動作は、 非オプションの引き数が現れた段階で終了する。 optstring の先頭文字が aq-aq である場合には、 オプションでない argv 要素は、 文字コード 1 のオプションであるかのように扱われる (これを用いるプログラムは、 オプションや argv 要素を任意の順序で受け入れ、かつそれらの順序が 意味を持つように書かれている必要がある)。 "--" は特殊な引き数で、スキャンのモードによらず、 オプションのスキャンを強制的に終了させる。
認識できないオプション文字があると、 getopt() はエラーメッセージを標準エラー出力 stderr に表示し、 その文字を optopt に保存して aq?aq を返す。 呼び出したプログラムで opterr を 0 にしておけば、 エラーメッセージの表示を抑制できる。
getopt() は argv の中に optstring にないオプション文字を見つけた場合、 またはオプション引き数が足りないことが分かった場合、 aq?aq を返して外部変数 optopt をそのオプション文字に設定する。 optstring の (上で説明したオプションで指定できる aq+aq または aq-aq 後に続く) 最初の文字が コロン (aq:aq) のとき、 getopt() はオプション引き数が足りない場合に aq?aq ではなく aq:aq を返す。 エラーを見つけた場合で、かつ optstring の最初の文字がコロンでなく、 かつ外部変数 opterr が 0 でない場合 (これがデフォルト)、 getopt() はエラーメッセージを表示する。
longopts は struct option の要素からなる配列の、先頭要素へのポインタである。 struct option は <getopt.h> で以下のように定義されている。
struct option {
    const char *name;
    int         has_arg;
    int        *flag;
    int         val;
};
それぞれのフィールドの意味は以下の通り。
配列の最後の要素は、全て 0 で埋められていなければならない。
longindex は、NULL でなければ、 長いオプションのインデックスを longopts からの相対位置として保持している変数へのポインタとなる。
getopt_long_only() は getopt_long() と同様の動作をするが、 aq-aq も "--" と同様に、 長いオプションとして扱われる。aq-aq で始まる ("--" 以外の) オプションが、長いものにはマッチしないが短いものに マッチする場合においては、それは短いオプションとして解釈される。
getopt_long() と getopt_long_only() も、 短いオプション文字を認識した場合にはその文字を返す。 長いオプションに対しては、 flag が NULL なら val を返し、 flag が NULL 以外なら 0 を返す。 エラーと -1 の返り値は getopt() と同じである。 さらに aq?aq は、マッチが確定できない場合や余分なパラメーターがある場合にも返る。
optstring で aq+aq や aq-aq を使うのは GNU による拡張である.
古い実装のいくつかでは、 getopt() は <stdio.h> で宣言されていた。 SUSv1 では、 <unistd.h> か <stdio.h> のどちらかで 宣言してもよかった。 POSIX.1-2001 では、 getopt の宣言を <stdio.h> で行うのは「過去の名残」であるとされた。 POSIX.1-2001 では <stdio.h> で宣言を行うことを認めていない。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
    int flags, opt;
    int nsecs, tfnd;
    nsecs = 0;
    tfnd = 0;
    flags = 0;
    while ((opt = getopt(argc, argv, "nt:")) != -1) {
        switch (opt) {
        case aqnaq:
            flags = 1;
            break;
        case aqtaq:
            nsecs = atoi(optarg);
            tfnd = 1;
            break;
        default: /* aq?aq */
            fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
                    argv[0]);
            exit(EXIT_FAILURE);
        }
    }
    printf("flags=%d; tfnd=%d; optind=%d\n", flags, tfnd, optind);
    if (optind >= argc) {
        fprintf(stderr, "Expected argument after options\n");
        exit(EXIT_FAILURE);
    }
    printf("name argument = %s\n", argv[optind]);
    /* Other code omitted */
    exit(EXIT_SUCCESS);
}
以下は、 getopt_long() の使用法を、ほぼすべての機能について示したプログラムの例である。
#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit */
#include <getopt.h>
int
main(int argc, char **argv) {
    int c;
    int digit_optind = 0;
    while (1) {
        int this_option_optind = optind ? optind : 1;
        int option_index = 0;
        static struct option long_options[] = {
            {"add", 1, 0, 0},
            {"append", 0, 0, 0},
            {"delete", 1, 0, 0},
            {"verbose", 0, 0, 0},
            {"create", 1, 0, aqcaq},
            {"file", 1, 0, 0},
            {0, 0, 0, 0}
        };
        c = getopt_long(argc, argv, "abc:d:012",
                 long_options, &option_index);
        if (c == -1)
            break;
        switch (c) {
        case 0:
            printf("option %s", long_options[option_index].name);
            if (optarg)
                printf(" with arg %s", optarg);
            printf("\n");
            break;
        case aq0aq:
        case aq1aq:
        case aq2aq:
            if (digit_optind != 0 && digit_optind != this_option_optind)
              printf("digits occur in two different argv-elements.\n");
            digit_optind = this_option_optind;
            printf("option %c\n", c);
            break;
        case aqaaq:
            printf("option a\n");
            break;
        case aqbaq:
            printf("option b\n");
            break;
        case aqcaq:
            printf("option c with value aq%saq\n", optarg);
            break;
        case aqdaq:
            printf("option d with value aq%saq\n", optarg);
            break;
        case aq?aq:
            break;
        default:
            printf("?? getopt returned character code 0%o ??\n", c);
        }
    }
    if (optind < argc) {
        printf("non-option ARGV-elements: ");
        while (optind < argc)
            printf("%s ", argv[optind++]);
        printf("\n");
    }
    exit(EXIT_SUCCESS);
}