#### 25.2.1 Using the `getopt` function

Here are the details about how to call the `getopt` function. To use this facility, your program must include the header file `unistd.h`.

— Variable: int opterr

> If the value of this variable is nonzero, then `getopt` prints an error message to the standard error stream if it encounters an unknown option character or an option with a missing required argument. This is the default behavior. If you set this variable to zero, `getopt` does not print any messages, but it still returns the character `?` to indicate an error.

— Variable: int optopt

> When `getopt` encounters an unknown option character or an option with a missing required argument, it stores that option character in this variable. You can use this for providing your own diagnostic messages.

— Variable: int optind

> This variable is set by `getopt` to the index of the next element of the argv array to be processed. Once `getopt` has found all of the option arguments, you can use this variable to determine where the remaining non-option arguments begin. The initial value of this variable is `1`.

— Variable: char * optarg

> This variable is set by `getopt` to point at the value of the option argument, for those options that accept arguments.

— Function: int getopt (int argc, char *const *argv, const char *options)

> Preliminary: | MT-Unsafe race:getopt env | AS-Unsafe heap i18n lock corrupt | AC-Unsafe mem lock corrupt | See POSIX Safety Concepts.

> The `getopt` function gets the next option argument from the argument list specified by the argv and argc arguments. Normally these values come directly from the arguments received by `main`.

> The options argument is a string that specifies the option characters that are valid for this program. An option character in this string can be followed by a colon (‘`:`’) to indicate that it takes a required argument. If an option character is followed by two colons (‘`::`’), its argument is optional; this is a GNU extension.

> `getopt` has three ways to deal with options that follow non-options argv elements. The special argument ‘`--`’ forces in all cases the end of option scanning.

> - The default is to permute the contents of argv while scanning it so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this.
> - If the options argument string begins with a hyphen (‘`-`’), this is treated specially. It permits arguments that are not options to be returned as if they were associated with option character ‘`\1`’.
> - POSIX demands the following behavior: The first non-option stops option processing. This mode is selected by either setting the environment variable `POSIXLY_CORRECT` or beginning the options argument string with a plus sign (‘`+`’).

> The `getopt` function returns the option character for the next command line option. When no more option arguments are available, it returns `-1`. There may still be more non-option arguments; you must compare the external variable `optind` against the argc parameter to check this.

> If the option has an argument, `getopt` returns the argument by storing it in the variable optarg. You don't ordinarily need to copy the `optarg` string, since it is a pointer into the original argv array, not into a static area that might be overwritten.

> If `getopt` finds an option character in argv that was not included in options, or a missing option argument, it returns ‘`?`’ and sets the external variable `optopt` to the actual option character. If the first character of options is a colon (‘`:`’), then `getopt` returns ‘`:`’ instead of ‘`?`’ to indicate a missing option argument. In addition, if the external variable `opterr` is nonzero (which is the default), `getopt` prints an error message.