A robust command-line argument parser written in C++20.
- Cross-platform; tested on Windows, Mac, and Linux.
- Correctly handles Windows-specific text encodings of command-line arguments
- Supports single and double-dashed arguments with arbitrary names and types
- Supports optional
=signs (socmd --max-depth=5andcmd --max-depth 5both work)
- Supports optional
- Supports option bundling: combining multiple single-character boolean options with a single dash (e.g.
cmd -abcdrather thancmd -a -b -c -d)
Say you wanted a command to support the following options:
max_threads(akam): The maximum number of threads to use for the hypothetical commandquiet(akaq): Whether or not to suppress compiler outputoutfile(akao): The file path of the output filelog-errors(akal): Whether to write error messages to the output filefail-on-warning: Whether or not to abort if the system generates a warning
To have your command support these options, you would simply
- Add the fields to the
CommandLineOptionsclass (you would not need to change anything else), so it would look like
class CommandLineOptions {
...
public:
/* List options here as fields */
int max_threads = 0;
bool quiet = false;
std::string outfile = "output.txt";
bool log_errors = false;
bool fail_on_warning = false;
...
};- Then, for each option name, add one line to
CommandLineOptions::try_processing(). - Finally add the fields corresponding to your options to
std::formatter<CommandLineOptions>::format().
Afterwards, you would be able to execute your program, passing your options to the executable. For example, cpp_argument_parser would correctly handle all of the following:
./cmd --max_threads 5 -ql --outfile=log.txt./cmd -m=5 -l=false --fail-on-warning./cmd -q=1 --max_threads=20 -fl -o log.txt
The command-line arguments are directly accessible from the fields of CommandLineOptions, which are set in its constructor.
git clonethis repo.- After
git cloneing,cdto the top directory ofcpp_argument_parser, and create a build directory (e.g.mkdir build). cdinto the build directory and runcmake ...- Build the project (run
makeif the previous step generated Makefiles).
From the build directory, give executable permissions to the test script first using chmod +x ./../scripts/run_tests.sh (if on Linux). Then, use the command ./../scripts/run_tests.sh.