Go forward to Projects.
Go backward to Map.
Go up to Top.
C++ version of the GNU getopt function
**************************************
The GetOpt class provides an efficient and structured mechanism for
processing command-line options from an application program. The sample
program fragment below illustrates a typical use of the GetOpt class
for some hypothetical application program:
#include <stdio.h>
#include <GetOpt.h>
//...
int debug_flag, compile_flag, size_in_bytes;
int
main (int argc, char **argv)
{
// Invokes ctor `GetOpt (int argc, char **argv,
// char *optstring);'
GetOpt getopt (argc, argv, "dcs:");
int option_char;
// Invokes member function `int operator ()(void);'
while ((option_char = getopt ()) != EOF)
switch (option_char)
{
case 'd': debug_flag = 1; break;
case 'c': compile_flag = 1; break;
case 's': size_in_bytes = atoi (getopt.optarg); break;
case '?': fprintf (stderr,
"usage: %s [dcs<size>]\n", argv[0]);
}
}
Unlike the C library version, the libg++ GetOpt class uses its
constructor to initialize class data members containing the argument
count, argument vector, and the option string. This simplifies the
interface for each subsequent call to member function `int operator
()(void)'.
The C version, on the other hand, uses hidden static variables to
retain the option string and argument list values between calls to
`getopt'. This complicates the `getopt' interface since the argument
count, argument vector, and option string must be passed as parameters
for each invocation. For the C version, the loop in the previous
example becomes:
while ((option_char = getopt (argc, argv, "dcs:")) != EOF)
// ...
which requires extra overhead to pass the parameters for every call.
Along with the GetOpt constructor and `int operator ()(void)', the
other relevant elements of class GetOpt are:
`char *optarg'
Used for communication from `operator ()(void)' to the caller.
When `operator ()(void)' finds an option that takes an argument,
the argument value is stored here.
`int optind'
Index in `argv' of the next element to be scanned. This is used
for communication to and from the caller and for communication
between successive calls to `operator ()(void)'.
When `operator ()(void)' returns EOF, this is the index of the
first of the non-option elements that the caller should itself
scan.
Otherwise, `optind' communicates from one call to the next how much
of `argv' has been scanned so far.
The libg++ version of GetOpt acts like standard UNIX `getopt' for
the calling routine, but it behaves differently for the user, since it
allows the user to intersperse the options with the other arguments.
As GetOpt works, it permutes the elements of `argv' so that, when it
is done, all the options precede everything else. Thus all application
programs are extended to handle flexible argument order.
Setting the environment variable _POSIX_OPTION_ORDER disables
permutation. Then the behavior is completely standard.