1*89c4ff92SAndroid Build Coastguard Worker[](https://travis-ci.org/jarro2783/cxxopts) 2*89c4ff92SAndroid Build Coastguard Worker 3*89c4ff92SAndroid Build Coastguard Worker# Release versions 4*89c4ff92SAndroid Build Coastguard Worker 5*89c4ff92SAndroid Build Coastguard WorkerNote that `master` is generally a work in progress, and you probably want to use a 6*89c4ff92SAndroid Build Coastguard Workertagged release version. 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker## Version 3 breaking changes 9*89c4ff92SAndroid Build Coastguard Worker 10*89c4ff92SAndroid Build Coastguard WorkerIf you have used version 2, there are a couple of breaking changes in (the as 11*89c4ff92SAndroid Build Coastguard Workeryet unreleased, current master) version 3 that you should be aware of. If you are new to 12*89c4ff92SAndroid Build Coastguard Worker`cxxopts` you can skip this section. 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard WorkerThe parser no longer modifies its arguments, so you can pass a const `argc` and 15*89c4ff92SAndroid Build Coastguard Worker`argv` and expect them not to be changed. 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard WorkerThe `ParseResult` object no longer depends on the parser. So it can be returned 18*89c4ff92SAndroid Build Coastguard Workerfrom a scope outside the parser and still work. Now that the inputs are not 19*89c4ff92SAndroid Build Coastguard Workermodified, `ParseResult` stores a list of the unmatched arguments. These are 20*89c4ff92SAndroid Build Coastguard Workerretrieved like follows: 21*89c4ff92SAndroid Build Coastguard Worker 22*89c4ff92SAndroid Build Coastguard Worker```cpp 23*89c4ff92SAndroid Build Coastguard Workerauto result = options.parse(argc, argv); 24*89c4ff92SAndroid Build Coastguard Workerresult.unmatched(); // get the unmatched arguments 25*89c4ff92SAndroid Build Coastguard Worker``` 26*89c4ff92SAndroid Build Coastguard Worker 27*89c4ff92SAndroid Build Coastguard Worker# Quick start 28*89c4ff92SAndroid Build Coastguard Worker 29*89c4ff92SAndroid Build Coastguard WorkerThis is a lightweight C++ option parser library, supporting the standard GNU 30*89c4ff92SAndroid Build Coastguard Workerstyle syntax for options. 31*89c4ff92SAndroid Build Coastguard Worker 32*89c4ff92SAndroid Build Coastguard WorkerOptions can be given as: 33*89c4ff92SAndroid Build Coastguard Worker 34*89c4ff92SAndroid Build Coastguard Worker --long 35*89c4ff92SAndroid Build Coastguard Worker --long=argument 36*89c4ff92SAndroid Build Coastguard Worker --long argument 37*89c4ff92SAndroid Build Coastguard Worker -a 38*89c4ff92SAndroid Build Coastguard Worker -ab 39*89c4ff92SAndroid Build Coastguard Worker -abc argument 40*89c4ff92SAndroid Build Coastguard Worker 41*89c4ff92SAndroid Build Coastguard Workerwhere c takes an argument, but a and b do not. 42*89c4ff92SAndroid Build Coastguard Worker 43*89c4ff92SAndroid Build Coastguard WorkerAdditionally, anything after `--` will be parsed as a positional argument. 44*89c4ff92SAndroid Build Coastguard Worker 45*89c4ff92SAndroid Build Coastguard Worker## Basics 46*89c4ff92SAndroid Build Coastguard Worker 47*89c4ff92SAndroid Build Coastguard Worker```cpp 48*89c4ff92SAndroid Build Coastguard Worker#include <cxxopts.hpp> 49*89c4ff92SAndroid Build Coastguard Worker``` 50*89c4ff92SAndroid Build Coastguard Worker 51*89c4ff92SAndroid Build Coastguard WorkerCreate a `cxxopts::Options` instance. 52*89c4ff92SAndroid Build Coastguard Worker 53*89c4ff92SAndroid Build Coastguard Worker```cpp 54*89c4ff92SAndroid Build Coastguard Workercxxopts::Options options("MyProgram", "One line description of MyProgram"); 55*89c4ff92SAndroid Build Coastguard Worker``` 56*89c4ff92SAndroid Build Coastguard Worker 57*89c4ff92SAndroid Build Coastguard WorkerThen use `add_options`. 58*89c4ff92SAndroid Build Coastguard Worker 59*89c4ff92SAndroid Build Coastguard Worker```cpp 60*89c4ff92SAndroid Build Coastguard Workeroptions.add_options() 61*89c4ff92SAndroid Build Coastguard Worker ("d,debug", "Enable debugging") // a bool parameter 62*89c4ff92SAndroid Build Coastguard Worker ("i,integer", "Int param", cxxopts::value<int>()) 63*89c4ff92SAndroid Build Coastguard Worker ("f,file", "File name", cxxopts::value<std::string>()) 64*89c4ff92SAndroid Build Coastguard Worker ("v,verbose", "Verbose output", cxxopts::value<bool>()->default_value("false")) 65*89c4ff92SAndroid Build Coastguard Worker ; 66*89c4ff92SAndroid Build Coastguard Worker``` 67*89c4ff92SAndroid Build Coastguard Worker 68*89c4ff92SAndroid Build Coastguard WorkerOptions are declared with a long and an optional short option. A description 69*89c4ff92SAndroid Build Coastguard Workermust be provided. The third argument is the value, if omitted it is boolean. 70*89c4ff92SAndroid Build Coastguard WorkerAny type can be given as long as it can be parsed, with operator>>. 71*89c4ff92SAndroid Build Coastguard Worker 72*89c4ff92SAndroid Build Coastguard WorkerTo parse the command line do: 73*89c4ff92SAndroid Build Coastguard Worker 74*89c4ff92SAndroid Build Coastguard Worker```cpp 75*89c4ff92SAndroid Build Coastguard Workerauto result = options.parse(argc, argv); 76*89c4ff92SAndroid Build Coastguard Worker``` 77*89c4ff92SAndroid Build Coastguard Worker 78*89c4ff92SAndroid Build Coastguard WorkerTo retrieve an option use `result.count("option")` to get the number of times 79*89c4ff92SAndroid Build Coastguard Workerit appeared, and 80*89c4ff92SAndroid Build Coastguard Worker 81*89c4ff92SAndroid Build Coastguard Worker```cpp 82*89c4ff92SAndroid Build Coastguard Workerresult["opt"].as<type>() 83*89c4ff92SAndroid Build Coastguard Worker``` 84*89c4ff92SAndroid Build Coastguard Worker 85*89c4ff92SAndroid Build Coastguard Workerto get its value. If "opt" doesn't exist, or isn't of the right type, then an 86*89c4ff92SAndroid Build Coastguard Workerexception will be thrown. 87*89c4ff92SAndroid Build Coastguard Worker 88*89c4ff92SAndroid Build Coastguard WorkerNote that the result of `options.parse` should only be used as long as the 89*89c4ff92SAndroid Build Coastguard Worker`options` object that created it is in scope. 90*89c4ff92SAndroid Build Coastguard Worker 91*89c4ff92SAndroid Build Coastguard Worker## Unrecognised arguments 92*89c4ff92SAndroid Build Coastguard Worker 93*89c4ff92SAndroid Build Coastguard WorkerYou can allow unrecognised arguments to be skipped. This applies to both 94*89c4ff92SAndroid Build Coastguard Workerpositional arguments that are not parsed into another option, and `--` 95*89c4ff92SAndroid Build Coastguard Workerarguments that do not match an argument that you specify. This is done by 96*89c4ff92SAndroid Build Coastguard Workercalling: 97*89c4ff92SAndroid Build Coastguard Worker 98*89c4ff92SAndroid Build Coastguard Worker```cpp 99*89c4ff92SAndroid Build Coastguard Workeroptions.allow_unrecognised_options(); 100*89c4ff92SAndroid Build Coastguard Worker``` 101*89c4ff92SAndroid Build Coastguard Worker 102*89c4ff92SAndroid Build Coastguard Workerand in the result object they are retrieved with: 103*89c4ff92SAndroid Build Coastguard Worker 104*89c4ff92SAndroid Build Coastguard Worker```cpp 105*89c4ff92SAndroid Build Coastguard Workerresult.unmatched() 106*89c4ff92SAndroid Build Coastguard Worker``` 107*89c4ff92SAndroid Build Coastguard Worker 108*89c4ff92SAndroid Build Coastguard Worker## Exceptions 109*89c4ff92SAndroid Build Coastguard Worker 110*89c4ff92SAndroid Build Coastguard WorkerExceptional situations throw C++ exceptions. There are two types of 111*89c4ff92SAndroid Build Coastguard Workerexceptions: errors defining the options, and errors when parsing a list of 112*89c4ff92SAndroid Build Coastguard Workerarguments. All exceptions derive from `cxxopts::OptionException`. Errors 113*89c4ff92SAndroid Build Coastguard Workerdefining options derive from `cxxopts::OptionSpecException` and errors 114*89c4ff92SAndroid Build Coastguard Workerparsing arguments derive from `cxxopts::OptionParseException`. 115*89c4ff92SAndroid Build Coastguard Worker 116*89c4ff92SAndroid Build Coastguard WorkerAll exceptions define a `what()` function to get a printable string 117*89c4ff92SAndroid Build Coastguard Workerexplaining the error. 118*89c4ff92SAndroid Build Coastguard Worker 119*89c4ff92SAndroid Build Coastguard Worker## Help groups 120*89c4ff92SAndroid Build Coastguard Worker 121*89c4ff92SAndroid Build Coastguard WorkerOptions can be placed into groups for the purposes of displaying help messages. 122*89c4ff92SAndroid Build Coastguard WorkerTo place options in a group, pass the group as a string to `add_options`. Then, 123*89c4ff92SAndroid Build Coastguard Workerwhen displaying the help, pass the groups that you would like displayed as a 124*89c4ff92SAndroid Build Coastguard Workervector to the `help` function. 125*89c4ff92SAndroid Build Coastguard Worker 126*89c4ff92SAndroid Build Coastguard Worker## Positional Arguments 127*89c4ff92SAndroid Build Coastguard Worker 128*89c4ff92SAndroid Build Coastguard WorkerPositional arguments can be optionally parsed into one or more options. 129*89c4ff92SAndroid Build Coastguard WorkerTo set up positional arguments, call 130*89c4ff92SAndroid Build Coastguard Worker 131*89c4ff92SAndroid Build Coastguard Worker```cpp 132*89c4ff92SAndroid Build Coastguard Workeroptions.parse_positional({"first", "second", "last"}) 133*89c4ff92SAndroid Build Coastguard Worker``` 134*89c4ff92SAndroid Build Coastguard Worker 135*89c4ff92SAndroid Build Coastguard Workerwhere "last" should be the name of an option with a container type, and the 136*89c4ff92SAndroid Build Coastguard Workerothers should have a single value. 137*89c4ff92SAndroid Build Coastguard Worker 138*89c4ff92SAndroid Build Coastguard Worker## Default and implicit values 139*89c4ff92SAndroid Build Coastguard Worker 140*89c4ff92SAndroid Build Coastguard WorkerAn option can be declared with a default or an implicit value, or both. 141*89c4ff92SAndroid Build Coastguard Worker 142*89c4ff92SAndroid Build Coastguard WorkerA default value is the value that an option takes when it is not specified 143*89c4ff92SAndroid Build Coastguard Workeron the command line. The following specifies a default value for an option: 144*89c4ff92SAndroid Build Coastguard Worker 145*89c4ff92SAndroid Build Coastguard Worker```cpp 146*89c4ff92SAndroid Build Coastguard Workercxxopts::value<std::string>()->default_value("value") 147*89c4ff92SAndroid Build Coastguard Worker``` 148*89c4ff92SAndroid Build Coastguard Worker 149*89c4ff92SAndroid Build Coastguard WorkerAn implicit value is the value that an option takes when it is given on the 150*89c4ff92SAndroid Build Coastguard Workercommand line without an argument. The following specifies an implicit value: 151*89c4ff92SAndroid Build Coastguard Worker 152*89c4ff92SAndroid Build Coastguard Worker```cpp 153*89c4ff92SAndroid Build Coastguard Workercxxopts::value<std::string>()->implicit_value("implicit") 154*89c4ff92SAndroid Build Coastguard Worker``` 155*89c4ff92SAndroid Build Coastguard Worker 156*89c4ff92SAndroid Build Coastguard WorkerIf an option had both, then not specifying it would give the value `"value"`, 157*89c4ff92SAndroid Build Coastguard Workerwriting it on the command line as `--option` would give the value `"implicit"`, 158*89c4ff92SAndroid Build Coastguard Workerand writing `--option=another` would give it the value `"another"`. 159*89c4ff92SAndroid Build Coastguard Worker 160*89c4ff92SAndroid Build Coastguard WorkerNote that the default and implicit value is always stored as a string, 161*89c4ff92SAndroid Build Coastguard Workerregardless of the type that you want to store it in. It will be parsed as 162*89c4ff92SAndroid Build Coastguard Workerthough it was given on the command line. 163*89c4ff92SAndroid Build Coastguard Worker 164*89c4ff92SAndroid Build Coastguard Worker## Boolean values 165*89c4ff92SAndroid Build Coastguard Worker 166*89c4ff92SAndroid Build Coastguard WorkerBoolean options have a default implicit value of `"true"`, which can be 167*89c4ff92SAndroid Build Coastguard Workeroverridden. The effect is that writing `-o` by itself will set option `o` to 168*89c4ff92SAndroid Build Coastguard Worker`true`. However, they can also be written with various strings using `=value`. 169*89c4ff92SAndroid Build Coastguard WorkerThere is no way to disambiguate positional arguments from the value following 170*89c4ff92SAndroid Build Coastguard Workera boolean, so we have chosen that they will be positional arguments, and 171*89c4ff92SAndroid Build Coastguard Workertherefore, `-o false` does not work. 172*89c4ff92SAndroid Build Coastguard Worker 173*89c4ff92SAndroid Build Coastguard Worker## `std::vector<T>` values 174*89c4ff92SAndroid Build Coastguard Worker 175*89c4ff92SAndroid Build Coastguard WorkerParsing of list of values in form of an `std::vector<T>` is also supported, as long as `T` 176*89c4ff92SAndroid Build Coastguard Workercan be parsed. To separate single values in a list the definition `CXXOPTS_VECTOR_DELIMITER` 177*89c4ff92SAndroid Build Coastguard Workeris used, which is ',' by default. Ensure that you use no whitespaces between values because 178*89c4ff92SAndroid Build Coastguard Workerthose would be interpreted as the next command line option. Example for a command line option 179*89c4ff92SAndroid Build Coastguard Workerthat can be parsed as a `std::vector<double>`: 180*89c4ff92SAndroid Build Coastguard Worker 181*89c4ff92SAndroid Build Coastguard Worker~~~ 182*89c4ff92SAndroid Build Coastguard Worker--my_list=1,-2.1,3,4.5 183*89c4ff92SAndroid Build Coastguard Worker~~~ 184*89c4ff92SAndroid Build Coastguard Worker 185*89c4ff92SAndroid Build Coastguard Worker## Options specified multiple times 186*89c4ff92SAndroid Build Coastguard Worker 187*89c4ff92SAndroid Build Coastguard WorkerThe same option can be specified several times, with different arguments, which will all 188*89c4ff92SAndroid Build Coastguard Workerbe recorded in order of appearance. An example: 189*89c4ff92SAndroid Build Coastguard Worker 190*89c4ff92SAndroid Build Coastguard Worker~~~ 191*89c4ff92SAndroid Build Coastguard Worker--use train --use bus --use ferry 192*89c4ff92SAndroid Build Coastguard Worker~~~ 193*89c4ff92SAndroid Build Coastguard Worker 194*89c4ff92SAndroid Build Coastguard Workerthis is supported through the use of a vector of value for the option: 195*89c4ff92SAndroid Build Coastguard Worker 196*89c4ff92SAndroid Build Coastguard Worker~~~ 197*89c4ff92SAndroid Build Coastguard Workeroptions.add_options() 198*89c4ff92SAndroid Build Coastguard Worker ("use", "Usable means of transport", cxxopts::value<std::vector<std::string>>()) 199*89c4ff92SAndroid Build Coastguard Worker~~~ 200*89c4ff92SAndroid Build Coastguard Worker 201*89c4ff92SAndroid Build Coastguard Worker## Custom help 202*89c4ff92SAndroid Build Coastguard Worker 203*89c4ff92SAndroid Build Coastguard WorkerThe string after the program name on the first line of the help can be 204*89c4ff92SAndroid Build Coastguard Workercompletely replaced by calling `options.custom_help`. Note that you might 205*89c4ff92SAndroid Build Coastguard Workeralso want to override the positional help by calling `options.positional_help`. 206*89c4ff92SAndroid Build Coastguard Worker 207*89c4ff92SAndroid Build Coastguard Worker 208*89c4ff92SAndroid Build Coastguard Worker## Example 209*89c4ff92SAndroid Build Coastguard Worker 210*89c4ff92SAndroid Build Coastguard WorkerPutting all together: 211*89c4ff92SAndroid Build Coastguard Worker```cpp 212*89c4ff92SAndroid Build Coastguard Workerint main(int argc, char** argv) 213*89c4ff92SAndroid Build Coastguard Worker{ 214*89c4ff92SAndroid Build Coastguard Worker cxxopts::Options options("test", "A brief description"); 215*89c4ff92SAndroid Build Coastguard Worker 216*89c4ff92SAndroid Build Coastguard Worker options.add_options() 217*89c4ff92SAndroid Build Coastguard Worker ("b,bar", "Param bar", cxxopts::value<std::string>()) 218*89c4ff92SAndroid Build Coastguard Worker ("d,debug", "Enable debugging", cxxopts::value<bool>()->default_value("false")) 219*89c4ff92SAndroid Build Coastguard Worker ("f,foo", "Param foo", cxxopts::value<int>()->default_value("10")) 220*89c4ff92SAndroid Build Coastguard Worker ("h,help", "Print usage") 221*89c4ff92SAndroid Build Coastguard Worker ; 222*89c4ff92SAndroid Build Coastguard Worker 223*89c4ff92SAndroid Build Coastguard Worker auto result = options.parse(argc, argv); 224*89c4ff92SAndroid Build Coastguard Worker 225*89c4ff92SAndroid Build Coastguard Worker if (result.count("help")) 226*89c4ff92SAndroid Build Coastguard Worker { 227*89c4ff92SAndroid Build Coastguard Worker std::cout << options.help() << std::endl; 228*89c4ff92SAndroid Build Coastguard Worker exit(0); 229*89c4ff92SAndroid Build Coastguard Worker } 230*89c4ff92SAndroid Build Coastguard Worker bool debug = result["debug"].as<bool>(); 231*89c4ff92SAndroid Build Coastguard Worker std::string bar; 232*89c4ff92SAndroid Build Coastguard Worker if (result.count("bar")) 233*89c4ff92SAndroid Build Coastguard Worker bar = result["bar"].as<std::string>(); 234*89c4ff92SAndroid Build Coastguard Worker int foo = result["foo"].as<int>(); 235*89c4ff92SAndroid Build Coastguard Worker 236*89c4ff92SAndroid Build Coastguard Worker return 0; 237*89c4ff92SAndroid Build Coastguard Worker} 238*89c4ff92SAndroid Build Coastguard Worker``` 239*89c4ff92SAndroid Build Coastguard Worker 240*89c4ff92SAndroid Build Coastguard Worker# Linking 241*89c4ff92SAndroid Build Coastguard Worker 242*89c4ff92SAndroid Build Coastguard WorkerThis is a header only library. 243*89c4ff92SAndroid Build Coastguard Worker 244*89c4ff92SAndroid Build Coastguard Worker# Requirements 245*89c4ff92SAndroid Build Coastguard Worker 246*89c4ff92SAndroid Build Coastguard WorkerThe only build requirement is a C++ compiler that supports C++11 features such as: 247*89c4ff92SAndroid Build Coastguard Worker 248*89c4ff92SAndroid Build Coastguard Worker* regex 249*89c4ff92SAndroid Build Coastguard Worker* constexpr 250*89c4ff92SAndroid Build Coastguard Worker* default constructors 251*89c4ff92SAndroid Build Coastguard Worker 252*89c4ff92SAndroid Build Coastguard WorkerGCC >= 4.9 or clang >= 3.1 with libc++ are known to work. 253*89c4ff92SAndroid Build Coastguard Worker 254*89c4ff92SAndroid Build Coastguard WorkerThe following compilers are known not to work: 255*89c4ff92SAndroid Build Coastguard Worker 256*89c4ff92SAndroid Build Coastguard Worker* MSVC 2013 257*89c4ff92SAndroid Build Coastguard Worker 258*89c4ff92SAndroid Build Coastguard Worker# TODO list 259*89c4ff92SAndroid Build Coastguard Worker 260*89c4ff92SAndroid Build Coastguard Worker* Allow unrecognised options. 261