Processing Command-Line Input
This page concerns itself largely on the GNU implementation of
getopt() and it’s variants (more likely than not you will be using this library), and how they relate to the POSIX standard.
First, A Little Terminology
|Command-line||A text-based program (called a terminal) that is used to call and control other programs.|
|Options||Optional arguments in a command-line message.||In git commit -m "Example" , -m is the option.|
|Long Options||Long options are distinguished from just "options" by the fact they use more than one ASCII character to describe them. This is a GNU extension to the POSIX standard.||In git commit --verbose, --verbose is a long option.|
|Parameters||Non-optional arguments in the command-line message.|
|Option Arguments||Options can have associated values. They may non-optional or optional. The fact that they are name option arguments and that **they can be optional themselves** can lead to confusion!||In git commit -m "Example", "Example" is the non-optional option argument.|
getopt() is a standard C library function that is commonly used to decode command-line options that are passed into the
main() function from the calling program (which is usually a terminal, e.g. bash). It can be used in your C code by including
It is a function which is designed to be called multiple times until it returns
-1, indicating that it has finished processing all of the options.
It supports single character options preceded by a single
The header file
getopt.h exposes four variables used by
getopt() that you can check to find the state of the function.
getopt() re-arranges the variable pointer array as it is processing, so that when it is complete, the program name is first (as it was originally), followed by all the options, and lastly all the parameters. You can use this feature to identify the parameters once
getopt() is finished.
getopt_long() is an extension of
getopt() that allows long options, that is, options that are described with more than one ASCII character and preceeded by – (e.g.
--speed=54). It is part the GNU C library (glibc).
The way long options are specified and handled is radically different to that for short options. The
getopt_long() function accepts…
Argtable is an open-source ANSI C library for parsing GNU-style command line options. Because it is ANSI compliant it is compilable on a huge range of operating systems, including Linux, FreeBSD, Cygwin, Apple Mac OS X and Windows, a compilable with the most common compilers on these operating systems. This library is well documented.
There is a C++ version of getopt() in the GNU C++ library. It is used by including GetOpt.h (#include <GetOpt.h>) into your C++ project (note the captilised ‘G’ and ‘O’). It is described in more detail here.
Another popular C++ version is called getoptpp. It is pretty code heavy (uses
<vector>, e.t.c, and probably not suitable for embedded systems. Supports long options.
There is a C++ version, “The Lean Mean C++ Option Parser”, which is a header-only, light-weight, option parser which is meant to be easy to use. Differs from
getopt() in it’s extra functionality.
gFlags (a portmanteau of Google Flags) is a C++ options parser that is released under the New BSD License.
This work is licensed under a Creative Commons Attribution 4.0 International License .