I know of the following:
getopt(3)
getopt_long
argp
parser for Unix-style argument vectorsI'm sure there's more that I haven't used or even heard of; a quick Google search reveals Gopt, argtable, and Optlist.
Personally, I like argp
best, and every program I wrote using getopt
/getopt_long
(beyond a certain baseline of complexity) has been converted to use argp
. It's more widely available than popt
, more powerful than getopt_long
, well-documented, consistent with all the GNU-style conventions, and very flexible. On the downside, it's far from the easiest to use (thanks to being so flexible), and the code to support it is quite verbose (as are many things in C).
What do you use, and why?
Yes, I mean C rather than C++. There are a ton of C++ parsers, but I don't use C++.
John Millikin notes that popt
is no longer maintained. I list it because many programs still use it -- including AbiWord, rpm, rsync, and samba -- despite Gnome's efforts to migrate away. But I've added a link to Glib's argument parser now, too.
For C++ argument parsing, see the question What parameter parser libraries are there for C++?
The getopt() is one of the built-in C function that are used for taking the command line options. The syntax of this function is like below − getopt(int argc, char *const argv[], const char *optstring) The opstring is a list of characters. Each of them representing a single character option.
optarg indicates an optional parameter to a command line option. opterr can be set to 0 to prevent getopt() from printing error messages. optind is the index of the next element of the argument list to be process, and optopt is the command line option last matched.
argc stands for argument count and argv stands for argument values. These are variables passed to the main function when it starts executing.
GNU has gengetopt which generates code for an options data structure and the getopt_long
code to parse the command line and fill the structure.. It's fairly easy to learn and works well.
As a bonus you can pass the options structure around your code and avoid global storage if desired.
It provides GNU style semantics (obviously), and is small enough to simply include with the project for distribution if you're not sure of your audience's build environment.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With