To accept GNU-style long options as well as single-character options,
getopt_long instead of
getopt. This function is
declared in getopt.h, not unistd.h. You should make every
program accept long options if it uses any options, for this takes
little extra work and helps beginners remember how to use the program.
This structure describes a single long option name for the sake of
getopt_long. The argument longopts must be an array of these structures, one for each long option. Terminate the array with an element containing all zeros.
struct optionstructure has these fields:
const char *name
- This field is the name of the option. It is a string.
- This field says whether the option takes an argument. It is an integer, and there are three legitimate values:
- These fields control how to report or act on the option when it occurs.
flagis a null pointer, then the
valis a value which identifies this option. Often these values are chosen to uniquely identify particular long options.
flagis not a null pointer, it should be the address of an
intvariable which is the flag for this option. The value in
valis the value to store in the flag to indicate that the option was seen.
Decode options from the vector argv (whose length is argc). The argument shortopts describes the short options to accept, just as it does in
getopt. The argument longopts describes the long options to accept (see above).
getopt_longencounters a short option, it does the same thing that
getoptwould do: it returns the character code for the option, and stores the options argument (if it has one) in
getopt_longencounters a long option, it takes actions based on the
valfields of the definition of that option.
flagis a null pointer, then
getopt_longreturns the contents of
valto indicate which option it found. You should arrange distinct values in the
valfield for options with different meanings, so you can decode these values after
getopt_longreturns. If the long option is equivalent to a short option, you can use the short option's character code in
flagis not a null pointer, that means this option should just set a flag in the program. The flag is a variable of type
intthat you define. Put the address of the flag in the
flagfield. Put in the
valfield the value you would like this option to store in the flag. In this case,
For any long option,
getopt_longtells you the index in the array longopts of the options definition, by storing it into
*indexptr. You can get the name of the option with longopts
].name. So you can distinguish among long options either by the values in their
valfields or by their indices. You can also distinguish in this way among long options that set flags.
When a long option has an argument,
getopt_longputs the argument value in the variable
optargbefore returning. When the option has no argument, the value in
optargis a null pointer. This is how you can tell whether an optional argument was supplied.
getopt_longhas no more options to handle, it returns
-1, and leaves in the variable
optindthe index in argv of the next remaining argument.
Since long option names were used before the
options was invented there are program interfaces which require programs
to recognize options like ‘-option value’ instead of
‘--option value’. To enable these programs to use the GNU
getopt functionality there is one more function available.
getopt_long_onlyfunction is equivalent to the
getopt_longfunction but it allows to specify the user of the application to pass long options with only ‘-’ instead of ‘--’. The ‘--’ prefix is still recognized but instead of looking through the short options if a ‘-’ is seen it is first tried whether this parameter names a long option. If not, it is parsed as a short option.
getopt_long_onlyis used starting an application withapp -foo
getopt_long_onlywill first look for a long option named ‘foo’. If this is not found, the short options ‘f’, ‘o’, and again ‘o’ are recognized.