C++ Programming
made by https://0x3d.site
GitHub - CLIUtils/CLI11: CLI11 is a command line parser for C++11 and beyond that provides a rich feature set with a simple and intuitive interface.CLI11 is a command line parser for C++11 and beyond that provides a rich feature set with a simple and intuitive interface. - CLIUtils/CLI11
Visit Site
GitHub - CLIUtils/CLI11: CLI11 is a command line parser for C++11 and beyond that provides a rich feature set with a simple and intuitive interface.
CLI11: Command line parser for C++11
What's new • Documentation • API Reference
CLI11 is a command line parser for C++11 and beyond that provides a rich feature set with a simple and intuitive interface.
Table of Contents
- CLI11: Command line parser for C++11
Features that were added in the last released minor version are marked with "🆕". Features only available in main are marked with "🚧".
Background
Introduction
CLI11 provides all the features you expect in a powerful command line parser,
with a beautiful, minimal syntax and no dependencies beyond C++11. It is header
only, and comes in a single file form for easy inclusion in projects. It is easy
to use for small projects, but powerful enough for complex command line
projects, and can be customized for frameworks. It is tested on Azure and
GitHub Actions, and was originally used by the GooFit GPU
fitting framework. It was inspired by plumbum.cli
for
Python. CLI11 has a user friendly introduction in this README, a more in-depth
tutorial GitBook, as well as API documentation generated by
Travis. See the changelog or GitHub Releases for details for
current and past releases. Also see the Version 1.0 post, Version 1.3
post, Version 1.6 post, or Version 2.0 post for more information.
You can be notified when new releases are made by subscribing to https://github.com/CLIUtils/CLI11/releases.atom on an RSS reader, like Feedly, or use the releases mode of the GitHub watching tool.
Why write another CLI parser?
An acceptable CLI parser library should be all of the following:
- Easy to include (i.e., header only, one file if possible, no external requirements).
- Short, simple syntax: This is one of the main reasons to use a CLI parser, it should make variables from the command line nearly as easy to define as any other variables. If most of your program is hidden in CLI parsing, this is a problem for readability.
- C++11 or better: Should work with GCC 4.8+ (default on CentOS/RHEL 7), Clang 3.4+, AppleClang 7+, NVCC 7.0+, or MSVC 2015+.
- Work on Linux, macOS, and Windows.
- Well tested on all common platforms and compilers. "Well" is defined as having good coverage measured by CodeCov.
- Clear help printing.
- Nice error messages.
- Standard shell idioms supported naturally, like grouping flags, a positional separator, etc.
- Easy to execute, with help, parse errors, etc. providing correct exit and details.
- Easy to extend as part of a framework that provides "applications" to users.
- Usable subcommand syntax, with support for multiple subcommands, nested subcommands, option groups, and optional fallthrough (explained later).
- Ability to add a configuration file (
TOML
,INI
, or custom format), and produce it as well. - Produce real values that can be used directly in code, not something you have pay compute time to look up, for HPC applications.
- Work with common types, simple custom types, and extensible to exotic types.
- Permissively licensed.
Other parsers
Library | My biased opinion |
---|---|
Boost Program Options | A great library if you already depend on Boost, but its pre-C++11 syntax is really odd and setting up the correct call in the main function is poorly documented (and is nearly a page of code). A simple wrapper for the Boost library was originally developed, but was discarded as CLI11 became more powerful. The idea of capturing a value and setting it originated with Boost PO. See this comparison. |
The Lean Mean C++ Option Parser | One header file is great, but the syntax is atrocious, in my opinion. It was quite impractical to wrap the syntax or to use in a complex project. It seems to handle standard parsing quite well. |
TCLAP | The not-quite-standard command line parsing causes common shortcuts to fail. It also seems to be poorly supported, with only minimal bugfixes accepted. Header only, but in quite a few files. Has not managed to get enough support to move to GitHub yet. No subcommands. Produces wrapped values. |
Cxxopts | C++11, single file, and nice CMake support, but requires regex, therefore GCC 4.8 (CentOS 7 default) does not work. Syntax closely based on Boost PO, so not ideal but familiar. |
DocOpt | Completely different approach to program options in C++11, you write the docs and the interface is generated. Too fragile and specialized. |
After I wrote this, I also found the following libraries:
Library | My biased opinion |
---|---|
GFlags | The Google Commandline Flags library. Uses macros heavily, and is limited in scope, missing things like subcommands. It provides a simple syntax and supports config files/env vars. |
GetOpt | Very limited C solution with long, convoluted syntax. Does not support much of anything, like help generation. Always available on UNIX, though (but in different flavors). |
ProgramOptions.hxx | Interesting library, less powerful and no subcommands. Nice callback system. |
Args | Also interesting, and supports subcommands. I like the optional-like design, but CLI11 is cleaner and provides direct value access, and is less verbose. |
Argument Aggregator | I'm a big fan of the fmt library, and the try-catch statement looks familiar. :thumbsup: Doesn't seem to support subcommands. |
Clara | Simple library built for the excellent Catch testing framework. Unique syntax, limited scope. |
Argh! | Very minimalistic C++11 parser, single header. Don't have many features. No help generation?!?! At least it's exception-free. |
CLI | Custom language and parser. Huge build-system overkill for very little benefit. Last release in 2009, but still occasionally active. |
argparse | C++17 single file argument parser. Design seems similar to CLI11 in some ways. The author has several other interesting projects. |
lyra | a simple header only parser with composable options. Might work well for simple standardized parsing |
See Awesome C++ for a less-biased list of parsers. You can also find other single file libraries at Single file libs.
None of these libraries fulfill all the above requirements, or really even come close. As you probably have already guessed, CLI11 does. So, this library was designed to provide a great syntax, good compiler compatibility, and minimal installation fuss.
Features not supported by this library
There are some other possible "features" that are intentionally not supported by this library:
- Completion of partial options, such as Python's
argparse
supplies for incomplete arguments. It's better not to guess. Most third party command line parsers for python actually reimplement command line parsing rather than using argparse because of this perceived design flaw (recent versions do have an option to disable it). - Autocomplete: This might eventually be added to both Plumbum and CLI11, but it is not supported yet.
Install
To use, the most common methods are described here additional methods and details are available at installation:
- All-in-one local header: Copy
CLI11.hpp
from the most recent release into your include directory, and you are set. This is combined from the source files for every release. This includes the entire command parser library, but does not include separate utilities (likeTimer
,AutoTimer
). The utilities are completely self contained and can be copied separately. - All-in-one global header: Like above, but copying the file to a shared folder
location like
/opt/CLI11
. Then, the C++ include path has to be extended to point at this folder. With CMake 3.10+, useinclude_directories(/opt/CLI11)
- For other methods including using CMake, conan or vcpkg and some specific instructions for GCC 8 or WASI see installation.
Usage
Adding options
To set up, add options, and run, your main function will look something like this:
int main(int argc, char** argv) {
CLI::App app{"App description"};
argv = app.ensure_utf8(argv);
std::string filename = "default";
app.add_option("-f,--file", filename, "A help string");
CLI11_PARSE(app, argc, argv);
return 0;
}
For more information about 🆕ensure_utf8
the section on
Unicode support below. The 🆕ensure_utf8
function is only
available in main currently and not in a release.
try {
app.parse(argc, argv);
} catch (const CLI::ParseError &e) {
return app.exit(e);
}
The try/catch block ensures that -h,--help
or a parse error will exit with the
correct return code (selected from CLI::ExitCodes
). (The return here should be
inside main
). You should not assume that the option values have been set
inside the catch block; for example, help flags intentionally short-circuit all
other processing for speed and to ensure required options and the like do not
interfere.
The initialization is just one line, adding options is just two each. The parse
macro is just one line (or 5 for the contents of the macro). After the app runs,
the filename will be set to the correct value if it was passed, otherwise it
will be set to the default. You can check to see if this was passed on the
command line with app.count("--file")
.
Option types
While all options internally are the same type, there are several ways to add an option depending on what you need. The supported values are:
// Add options
app.add_option(option_name, help_str="")
app.add_option(option_name,
variable_to_bind_to, // bool, char(see note), int, float, vector, enum, std::atomic, or string-like, or anything with a defined conversion from a string or that takes an int, double, or string in a constructor. Also allowed are tuples, std::array or std::pair. Also supported are complex numbers, wrapper types, and containers besides vectors of any other supported type.
help_string="")
app.add_option_function<type>(option_name,
function <void(const type &value)>, // type can be any type supported by add_option
help_string="")
// char as an option type is supported before 2.0 but in 2.0 it defaulted to allowing single non numerical characters in addition to the numeric values.
// There is a template overload which takes two template parameters the first is the type of object to assign the value to, the second is the conversion type. The conversion type should have a known way to convert from a string, such as any of the types that work in the non-template version. If XC is a std::pair and T is some non pair type. Then a two argument constructor for T is called to assign the value. For tuples or other multi element types, XC must be a single type or a tuple like object of the same size as the assignment type
app.add_option<typename T, typename XC>(option_name,
T &output, // output must be assignable or constructible from a value of type XC
help_string="")
// Add flags
app.add_flag(option_name,
help_string="")
app.add_flag(option_name,
variable_to_bind_to, // bool, int, float, complex, containers, enum, std::atomic, or string-like, or any singular object with a defined conversion from a string like add_option
help_string="")
app.add_flag_function(option_name,
function <void(std::int64_t count)>,
help_string="")
app.add_flag_callback(option_name,function<void(void)>,help_string="")
// Add subcommands
App* subcom = app.add_subcommand(name, description);
Option_group *app.add_option_group(name,description);
An option name may start with any character except ('-', ' ', '\n', and '!').
For long options, after the first character all characters are allowed except
('=',':','{',' ', '\n'). For the add_flag*
functions '{' and '!' have special
meaning which is why they are not allowed. Names are given as a comma separated
string, with the dash or dashes. An option or flag can have as many names as you
want, and afterward, using count
, you can use any of the names, with dashes as
needed, to count the options. One of the names is allowed to be given without
proceeding dash(es); if present the option is a positional option, and that name
will be used on the help line for its positional form. The string ++
is also
not allowed as option name due to its use as an array separator and marker on
config files.
The add_option_function<type>(...
function will typically require the template
parameter be given unless a std::function
object with an exact match is
passed. The type can be any type supported by the add_option
function. The
function should throw an error (CLI::ConversionError
or CLI::ValidationError
possibly) if the value is not valid.
The two parameter template overload can be used in cases where you want to restrict the input such as
double val
app.add_option<double,unsigned int>("-v",val);
which would first verify the input is convertible to an unsigned int
before
assigning it. Or using some variant type
using vtype=std::variant<int, double, std::string>;
vtype v1;
app.add_option<vtype,std:string>("--vs",v1);
app.add_option<vtype,int>("--vi",v1);
app.add_option<vtype,double>("--vf",v1);
otherwise the output would default to a string. The add_option
can be used
with any integral or floating point types, enumerations, or strings. Or any type
that takes an int, double, or std::string in an assignment operator or
constructor. If an object can take multiple varieties of those, std::string
takes precedence, then double then int. To better control which one is used or
to use another type for the underlying conversions use the two parameter
template to directly specify the conversion type.
Types such as (std or boost) optional<int>
, optional<double>
, and
optional<string>
and any other wrapper types are supported directly. For
purposes of CLI11 wrapper types are those which value_type
definition. See
CLI11 Advanced Topics/Custom Converters for information on how you can add your
own converters for additional types.
Vector types can also be used in the two parameter template overload
std::vector<double> v1;
app.add_option<std::vector<double>,int>("--vs",v1);
would load a vector of doubles but ensure all values can be represented as integers.
Automatic direct capture of the default string is disabled when using the two
parameter template. Use set_default_str(...)
or
->default_function(std::string())
to set the default string or capture
function directly for these cases.
Flag options specified through the add_flag*
functions allow a syntax for the
option names to default particular options to a false value or any other value
if some flags are passed. For example:
app.add_flag("--flag,!--no-flag",result,"help for flag");
specifies that if --flag
is passed on the command line result will be true or
contain a value of 1. If --no-flag
is passed result
will contain false or -1
if result
is a signed integer type, or 0 if it is an unsigned type. An
alternative form of the syntax is more explicit: "--flag,--no-flag{false}"
;
this is equivalent to the previous example. This also works for short form
options "-f,!-n"
or "-f,-n{false}"
. If variable_to_bind_to
is anything but
an integer value the default behavior is to take the last value given, while if
variable_to_bind_to
is an integer type the behavior will be to sum all the
given arguments and return the result. This can be modified if needed by
changing the multi_option_policy
on each flag (this is not inherited). The
default value can be any value. For example if you wished to define a numerical
flag:
app.add_flag("-1{1},-2{2},-3{3}",result,"numerical flag")
Using any of those flags on the command line will result in the specified number in the output. Similar things can be done for string values, and enumerations, as long as the default value can be converted to the given type.
On a C++14
compiler, you can pass a callback function directly to .add_flag
,
while in C++11 mode you'll need to use .add_flag_function
if you want a
callback function. The function will be given the number of times the flag was
passed. You can throw a relevant CLI::ParseError
to signal a failure.
Example
"one,-o,--one"
: Valid as long as not a flag, would create an option that can be specified positionally, or with-o
or--one
"this"
Can only be passed positionally"-a,-b,-c"
No limit to the number of non-positional option names
The add commands return a pointer to an internally stored Option
. This option
can be used directly to check for the count (->count()
) after parsing to avoid
a string based lookup.
Option options
Before parsing, you can set the following options:
->required()
: The program will quit if this option is not present. This ismandatory
in Plumbum, but required options seems to be a more standard term. For compatibility,->mandatory()
also works.->expected(N)
: TakeN
values instead of as many as possible, only for vector args. If negative, require at least-N
; end with--
or another recognized option or subcommand.->expected(MIN,MAX)
: Set a range of expected values to accompany an option.expected(0,1)
is the equivalent of making a flag.->type_name(typename)
: Set the name of an Option's type (type_name_fn
allows a function instead)->type_size(N)
: Set the intrinsic size of an option value. The parser will require multiples of this number if negative. Most of the time this is detected automatically though can be modified for specific use cases.->type_size(MIN,MAX)
: Set the intrinsic size of an option to a range.->needs(opt)
: This option requires another option to also be present, opt is anOption
pointer. Options can be removed from theneeds
withremove_needs(opt)
. The option can also be specified with a string containing the name of the option->excludes(opt)
: This option cannot be given withopt
present, opt is anOption
pointer. Can also be given as a string containing the name of the option. Options can be removed from the excludes list with->remove_excludes(opt)
->envname(name)
: Gets the value from the environment if present and not passed on the command line. 🆕 The value must also pass any validators to be used.->group(name)
: The help group to put the option in. No effect for positional options. Defaults to"Options"
. Options given an empty string will not show up in the help print (hidden).->ignore_case()
: Ignore the case on the command line (also works on subcommands, does not affect arguments).->ignore_underscore()
: Ignore any underscores in the options names (also works on subcommands, does not affect arguments). For example "option_one" will match with "optionone". This does not apply to short form options since they only have one character->disable_flag_override()
: From the command line long form flag options can be assigned a value on the command line using the=
notation--flag=value
. If this behavior is not desired, thedisable_flag_override()
disables it and will generate an exception if it is done on the command line. The=
does not work with short form flag options.->allow_extra_args(true/false)
: If set to true the option will take an unlimited number of arguments like a vector, if false it will limit the number of arguments to the size of the type used in the option. Default value depends on the nature of the type use, containers default to true, others default to false.->delimiter(char)
: Allows specification of a custom delimiter for separating single arguments into vector arguments, for example specifying->delimiter(',')
on an option would result in--opt=1,2,3
producing 3 elements of a vector and the equivalent of --opt 1 2 3 assuming opt is a vector value.->description(str)
: Set/change the description.->multi_option_policy(CLI::MultiOptionPolicy::Throw)
: Set the multi-option policy. Shortcuts available:->take_last()
,->take_first()
,->take_all()
, and->join()
. This will only affect options expecting 1 argument or bool flags (which do not inherit their default but always start with a specific policy).->join(delim)
can also be used to join with a specific delimiter. This equivalent to calling->delimiter(delim)
and->join()
. Valid values areCLI::MultiOptionPolicy::Throw
,CLI::MultiOptionPolicy::Throw
,CLI::MultiOptionPolicy::TakeLast
,CLI::MultiOptionPolicy::TakeFirst
,CLI::MultiOptionPolicy::Join
,CLI::MultiOptionPolicy::TakeAll
,CLI::MultiOptionPolicy::Sum
, andCLI::MultiOptionPolicy::Reverse
🆕.->check(std::string(const std::string &), validator_name="",validator_description="")
: Define a check function. The function should return a non empty string with the error message if the check fails->check(Validator)
: Use a Validator object to do the check see Validators for a description of available Validators and how to create new ones.->transform(std::string(std::string &), validator_name="",validator_description=")
: Converts the input string into the output string, in-place in the parsed options.->transform(Validator)
: Uses a Validator object to do the transformation see Validators for a description of available Validators and how to create new ones.->each(void(const std::string &)>
: Run this function on each value received, as it is received. It should throw aValidationError
if an error is encountered.->configurable(false)
: Disable this option from being in a configuration file.->capture_default_str()
: Store the current value attached and display it in the help string.->default_function(std::string())
: Advanced: Change the function thatcapture_default_str()
uses.->always_capture_default()
: Always runcapture_default_str()
when creating new options. Only useful on an App'soption_defaults
.->default_str(string)
: Set the default string directly (NO VALIDATION OR CALLBACKS). This string will also be used as a default value if no arguments are passed and the value is requested.->default_val(value)
: Generate the default string from a value and validate that the value is also valid. For options that assign directly to a value type the value in that type is also updated. Value must be convertible to a string(one of known types or have a stream operator). The callback may be triggered if therun_callback_for_default
is set.->run_callback_for_default()
: This will force the option callback to be executed or the variable set when thedefault_val
is set.->option_text(string)
: Sets the text between the option name and description.->force_callback()
: Causes the option callback or value set to be triggered even if the option was not present in parsing.->trigger_on_parse()
: If set, causes the callback and all associated validation checks for the option to be executed when the option value is parsed vs. at the end of all parsing. This could cause the callback to be executed multiple times. Also works with positional options.
These options return the Option
pointer, so you can chain them together, and
even skip storing the pointer entirely. The each
function takes any function
that has the signature void(const std::string&)
; it should throw a
ValidationError
when validation fails. The help message will have the name of
the parent option prepended. Since each
, check
and transform
use the same
underlying mechanism, you can chain as many as you want, and they will be
executed in order. Operations added through transform
are executed first in
reverse order of addition, and check
and each
are run following the
transform functions in order of addition. If you just want to see the
unconverted values, use .results()
to get the std::vector<std::string>
of
results.
On the command line, options can be given as:
-a
(flag)-abc
(flags can be combined)-f filename
(option)-ffilename
(no space required)-abcf filename
(flags and option can be combined)--long
(long flag)--long_flag=true
(long flag with equals to override default value)--file filename
(space)--file=filename
(equals)
If allow_windows_style_options()
is specified in the application or subcommand
options can also be given as:
/a
(flag)/f filename
(option)/long
(long flag)/file filename
(space)/file:filename
(colon)/long_flag:false
(long flag with : to override the default value)- Windows style options do not allow combining short options or values not
separated from the short option like with
-
options
- Windows style options do not allow combining short options or values not
separated from the short option like with
Long flag options may be given with an =<value>
to allow specifying a false
value, or some other value to the flag. See config files
for details on the values supported. NOTE: only the =
or :
for windows-style
options may be used for this, using a space will result in the argument being
interpreted as a positional argument. This syntax can override the default
values, and can be disabled by using disable_flag_override()
.
Extra positional arguments will cause the program to exit, so at least one
positional option with a vector is recommended if you want to allow extraneous
arguments. If you set .allow_extras()
on the main App
, you will not get an
error. You can access the missing options using remaining
(if you have
subcommands, app.remaining(true)
will get all remaining options, subcommands
included). If the remaining arguments are to processed by another App
then the
function remaining_for_passthrough()
can be used to get the remaining
arguments in reverse order such that app.parse(vector)
works directly and
could even be used inside a subcommand callback.
You can access a vector of pointers to the parsed options in the original order
using parse_order()
. If --
is present in the command line that does not end
an unlimited option, then everything after that is positional only.
Validators
Validators are structures to check or modify inputs, they can be used to verify
that an input meets certain criteria or transform it into another value. They
are added through the check
or transform
functions. The differences between
the two function are that checks do not modify the input whereas transforms can
and are executed before any Validators added through check
.
CLI11 has several Validators built-in that perform some common checks
CLI::IsMember(...)
: Require an option be a member of a given set. See Transforming Validators for more details.CLI::Transformer(...)
: Modify the input using a map. See Transforming Validators for more details.CLI::CheckedTransformer(...)
: Modify the input using a map, and require that the input is either in the set or already one of the outputs of the set. See Transforming Validators for more details.CLI::AsNumberWithUnit(...)
: Modify the<NUMBER> <UNIT>
pair by matching the unit and multiplying the number by the corresponding factor. It can be used as a base for transformers, that accept things like size values (1 KB
) or durations (0.33 ms
).CLI::AsSizeValue(...)
: Convert inputs like100b
,42 KB
,101 Mb
,11 Mib
to absolute values.KB
can be configured to be interpreted as 10^3 or 2^10.CLI::ExistingFile
: Requires that the file exists if given.CLI::ExistingDirectory
: Requires that the directory exists.CLI::ExistingPath
: Requires that the path (file or directory) exists.CLI::NonexistentPath
: Requires that the path does not exist.CLI::FileOnDefaultPath
: Best used as a transform, Will check that a file exists either directly or in a default path and update the path appropriately. See Transforming Validators for more detailsCLI::Range(min,max)
: Requires that the option be between min and max (make sure to use floating point if needed). Min defaults to 0.CLI::Bounded(min,max)
: Modify the input such that it is always between min and max (make sure to use floating point if needed). Min defaults to 0. Will produce an error if conversion is not possible.CLI::PositiveNumber
: Requires the number be greater than 0CLI::NonNegativeNumber
: Requires the number be greater or equal to 0CLI::Number
: Requires the input be a number.CLI::ValidIPV4
: Requires that the option be a valid IPv4 string e.g.'255.255.255.255'
,'10.1.1.7'
.CLI::TypeValidator<TYPE>
:Requires that the option be convertible to the specified type e.g.CLI::TypeValidator<unsigned int>()
would require that the input be convertible to anunsigned int
regardless of the end conversion.
These Validators can be used by simply passing the name into the check
or
transform
methods on an option
->check(CLI::ExistingFile);
->check(CLI::Range(0,10));
Validators can be merged using &
and |
and inverted using !
. For example:
->check(CLI::Range(0,10)|CLI::Range(20,30));
will produce a check to ensure a value is between 0 and 10 or 20 and 30.
->check(!CLI::PositiveNumber);
will produce a check for a number less than or equal to 0.
Transforming Validators
There are a few built in Validators that let you transform values if used with
the transform
function. If they also do some checks then they can be used
check
but some may do nothing in that case.
CLI::Bounded(min,max)
will bound values between min and max and values outside of that range are limited to min or max, it will fail if the value cannot be converted and produce aValidationError
- The
IsMember
Validator lets you specify a set of predefined options. You can pass any container or copyable pointer (includingstd::shared_ptr
) to a container to this Validator; the container just needs to be iterable and have a::value_type
. The key type should be convertible from a string, You can use an initializer list directly if you like. If you need to modify the set later, the pointer form lets you do that; the type message and check will correctly refer to the current version of the set. The container passed in can be a set, vector, or a map like structure. If used in thetransform
method the output value will be the matching key as it could be modified by filters.
After specifying a set of options, you can also specify "filter" functions of
the form T(T)
, where T
is the type of the values. The most common choices
probably will be CLI::ignore_case
an CLI::ignore_underscore
, and
CLI::ignore_space
. These all work on strings but it is possible to define
functions that work on other types. Here are some examples of IsMember
:
CLI::IsMember({"choice1", "choice2"})
: Select from exact match to choices.CLI::IsMember({"choice1", "choice2"}, CLI::ignore_case, CLI::ignore_underscore)
: Match things likeChoice_1
, too.CLI::IsMember(std::set<int>({2,3,4}))
: Most containers and types work; you just needstd::begin
,std::end
, and::value_type
.CLI::IsMember(std::map<std::string, TYPE>({{"one", 1}, {"two", 2}}))
: You can use maps; in->transform()
these replace the matched value with the matched key. The value member of the map is not used inIsMember
, so it can be any type.auto p = std::make_shared<std::vector<std::string>>(std::initializer_list<std::string>("one", "two")); CLI::IsMember(p)
: You can modifyp
later.- The
Transformer
andCheckedTransformer
Validators transform one value into another. Any container or copyable pointer (includingstd::shared_ptr
) to a container that generates pairs of values can be passed to theseValidator's
; the container just needs to be iterable and have a::value_type
that consists of pairs. The key type should be convertible from a string, and the value type should be convertible to a string You can use an initializer list directly if you like. If you need to modify the map later, the pointer form lets you do that; the description message will correctly refer to the current version of the map.Transformer
does not do any checking so values not in the map are ignored.CheckedTransformer
takes an extra step of verifying that the value is either one of the map key values, in which case it is transformed, or one of the expected output values, and if not will generate aValidationError
. A Transformer placed usingcheck
will not do anything.
After specifying a map of options, you can also specify "filter" just like in
CLI::IsMember
. Here are some examples (Transformer
and CheckedTransformer
are interchangeable in the examples) of Transformer
:
CLI::Transformer({{"key1", "map1"},{"key2","map2"}})
: Select from key values and produce map values.CLI::Transformer(std::map<std::string,int>({"two",2},{"three",3},{"four",4}}))
: most maplike containers work, the::value_type
needs to produce a pair of some kind.CLI::CheckedTransformer(std::map<std::string, int>({{"one", 1}, {"two", 2}}))
: You can use maps; in->transform()
these replace the matched key with the value.CheckedTransformer
also requires that the value either match one of the keys or match one of known outputs.auto p = std::make_shared<CLI::TransformPairs<std::string>>(std::initializer_list<std::pair<std::string,std::string>>({"key1", "map1"},{"key2","map2"})); CLI::Transformer(p)
: You can modifyp
later.TransformPairs<T>
is an alias forstd::vector<std::pair<<std::string,T>>
NOTES: If the container used in IsMember
, Transformer
, or
CheckedTransformer
has a find
function like std::unordered_map
or
std::map
then that function is used to do the searching. If it does not have a
find
function a linear search is performed. If there are filters present, the
fast search is performed first, and if that fails a linear search with the
filters on the key values is performed.
-
CLI::FileOnDefaultPath(default_path)
: can be used to check for files in a default path. If used as a transform it will first check that a file exists, if it does nothing further is done, if it does not it tries to add a default Path to the file and search there again. If the file does not exist an error is returned normally but this can be disabled usingCLI::FileOnDefaultPath(default_path, false)
. This allows multiple paths to be chained using multiple transform calls. -
CLI::EscapedString
: 🆕 can be used to process an escaped string. The processing is equivalent to that used for TOML config files, see TOML strings. With 2 notable exceptions. ` can also be used as a literal string notation, and it also allows binary string notation see binary strings. The escaped string processing will remove outer quotes if present,"
will indicate a string with potential escape sequences,'
and ` will indicate a literal string and the quotes removed but no escape sequences will be processed. This is the same escape processing as used in config files.
Validator operations
Validators are copyable and have a few operations that can be performed on them
to alter settings. Most of the built in Validators have a default description
that is displayed in the help. This can be altered via
.description(validator_description)
. The name of a Validator, which is useful
for later reference from the get_validator(name)
method of an Option
can be
set via .name(validator_name)
The operation function of a Validator can be set
via .operation(std::function<std::string(std::string &>)
. The .active()
function can activate or deactivate a Validator from the operation. A validator
can be set to apply only to a specific element of the output. For example in a
pair option std::pair<int, std::string>
the first element may need to be a
positive integer while the second may need to be a valid file. The
.application_index(int)
function can specify this. It is zero based and
negative indices apply to all values.
opt->check(CLI::Validator(CLI::PositiveNumber).application_index(0));
opt->check(CLI::Validator(CLI::ExistingFile).application_index(1));
All the validator operation functions return a Validator reference allowing them to be chained. For example
opt->check(CLI::Range(10,20).description("range is limited to sensible values").active(false).name("range"));
will specify a check on an option with a name "range", but deactivate it for the time being. The check can later be activated through
opt->get_validator("range")->active();
Custom Validators
A validator object with a custom function can be created via
CLI::Validator(std::function<std::string(std::string &)>,validator_description,validator_name="");
or if the operation function is set later they can be created with
CLI::Validator(validator_description);
It is also possible to create a subclass of CLI::Validator
, in which case it
can also set a custom description function, and operation function.
Querying Validators
Once loaded into an Option, a pointer to a named Validator can be retrieved via
opt->get_validator(name);
This will retrieve a Validator with the given name or throw a
CLI::OptionNotFound
error. If no name is given or name is empty the first
unnamed Validator will be returned or the first Validator if there is only one.
or
opt->get_validator(index);
Which will return a validator in the index it is applied which isn't necessarily
the order in which was defined. The pointer can be nullptr
if an invalid index
is given. Validators have a few functions to query the current values:
get_description()
: Will return a description stringget_name()
: Will return the Validator nameget_active()
: Will return the current active state, true if the Validator is active.get_application_index()
: Will return the current application index.get_modifying()
: Will return true if the Validator is allowed to modify the input, this can be controlled via thenon_modifying()
method, though it is recommended to letcheck
andtransform
option methods manipulate it if needed.
Getting results
In most cases, the fastest and easiest way is to return the results through a
callback or variable specified in one of the add_*
functions. But there are
situations where this is not possible or desired. For these cases the results
may be obtained through one of the following functions. Please note that these
functions will do any type conversions and processing during the call so should
not used in performance critical code:
->results()
: Retrieves a vector of strings with all the results in the order they were given.->results(variable_to_bind_to)
: Gets the results according to the MultiOptionPolicy and converts them just like theadd_option_function
with a variable.Value=opt->as<type>()
: Returns the result or default value directly as the specified type if possible, can be vector to return all results, and a non-vector to get the result according to the MultiOptionPolicy in place.
Subcommands
Subcommands are keywords that invoke a new set of options and features. For
example, the git
command has a long series of subcommands, like add
and
commit
. Each can have its own options and implementations. Subcommands are
supported in CLI11, and can be nested infinitely. To add a subcommand, call the
add_subcommand
method with a name and an optional description. This gives a
pointer to an App
that behaves just like the main app, and can take options or
further subcommands. Add ->ignore_case()
to a subcommand to allow any
variation of caps to also be accepted. ->ignore_underscore()
is similar, but
for underscores. Children inherit the current setting from the parent. You
cannot add multiple matching subcommand names at the same level (including
ignore_case
and ignore_underscore
).
If you want to require that at least one subcommand is given, use
.require_subcommand()
on the parent app. You can optionally give an exact
number of subcommands to require, as well. If you give two arguments, that sets
the min and max number allowed. 0 for the max number allowed will allow an
unlimited number of subcommands. As a handy shortcut, a single negative value N
will set "up to N" values. Limiting the maximum number allows you to keep
arguments that match a previous subcommand name from matching.
If an App
(main or subcommand) has been parsed on the command line, ->parsed
will be true (or convert directly to bool). All App
s have a
get_subcommands()
method, which returns a list of pointers to the subcommands
passed on the command line. A got_subcommand(App_or_name)
method is also
provided that will check to see if an App
pointer or a string name was
collected on the command line.
For many cases, however, using an app's callback capabilities may be easier.
Every app has a set of callbacks that can be executed at various stages of
parsing; a C++
lambda function (with capture to get parsed values) can be used
as input to the callback definition function. If you throw CLI::Success
or
CLI::RuntimeError(return_value)
, you can even exit the program through the
callback.
Multiple subcommands are allowed, to allow Click
like series of
commands (order is preserved). The same subcommand can be triggered multiple
times but all positional arguments will take precedence over the second and
future calls of the subcommand. ->count()
on the subcommand will return the
number of times the subcommand was called. The subcommand callback will only be
triggered once unless the .immediate_callback()
flag is set or the callback is
specified through the parse_complete_callback()
function. The
final_callback()
is triggered only once. In which case the callback executes
on completion of the subcommand arguments but after the arguments for that
subcommand have been parsed, and can be triggered multiple times.
Subcommands may also have an empty name either by calling add_subcommand
with
an empty string for the name or with no arguments. Nameless subcommands function
a similarly to groups in the main App
. See Option groups to
see how this might work. If an option is not defined in the main App, all
nameless subcommands are checked as well. This allows for the options to be
defined in a composable group. The add_subcommand
function has an overload for
adding a shared_ptr<App>
so the subcommand(s) could be defined in different
components and merged into a main App
, or possibly multiple Apps
. Multiple
nameless subcommands are allowed. Callbacks for nameless subcommands are only
triggered if any options from the subcommand were parsed. Subcommand names given
through the add_subcommand
method have the same restrictions as option names.
🆕 Options or flags in a subcommand may be directly specified using dot notation
--subcommand.long=val
(long subcommand option)--subcommand.long val
(long subcommand option)--subcommand.f=val
(short form subcommand option)--subcommand.f val
(short form subcommand option)--subcommand.f
(short form subcommand flag)--subcommand1.subsub.f val
(short form nested subcommand option)
The use of dot notation in this form is equivalent --subcommand.long <args>
=>
subcommand --long <args> ++
. Nested subcommands also work sub1.subsub
would
trigger the subsub subcommand in sub1
. This is equivalent to "sub1 subsub".
Quotes around the subcommand names are permitted 🆕 following the TOML standard
for such specification. This includes allowing escape sequences. For example
"subcommand".'f'
or "subcommand.with.dots".arg1 = value
.
Subcommand options
There are several options that are supported on the main app and subcommands and option_groups. These are:
.ignore_case()
: Ignore the case of this subcommand. Inherited by added subcommands, so is usually used on the mainApp
..ignore_underscore()
: Ignore any underscores in the subcommand name. Inherited by added subcommands, so is usually used on the mainApp
..allow_windows_style_options()
: Allow command line options to be parsed in the form of/s /long /file:file_name.ext
This option does not change how options are specified in theadd_option
calls or the ability to process options in the form of-s --long --file=file_name.ext
..allow_non_standard_option_names()
:🚧 Allow specification of single-
long form option names. This is not recommended but is available to enable reworking of existing interfaces. If this modifier is enabled on an app or subcommand, options or flags can be specified like normal but instead of throwing an exception, long form single dash option names will be allowed. It is not allowed to have a single character short option starting with the same character as a single dash long form name; for example,-s
and-single
are not allowed in the same application..fallthrough()
: Allow extra unmatched options and positionals to "fall through" and be matched on a parent option. Subcommands by default are allowed to "fall through" as in they will first attempt to match on the current subcommand and if they fail will progressively check parents for matching subcommands. This can be disabled throughsubcommand_fallthrough(false)
🚧..subcommand_fallthrough()
: 🚧 Allow subcommands to "fall through" and be matched on a parent option. Disabling this prevents additional subcommands at the same level from being matched. It can be useful in certain circumstances where there might be ambiguity between subcommands and positionals. The default is true..configurable()
: Allow the subcommand to be triggered from a configuration file. By default subcommand options in a configuration file do not trigger a subcommand but will just update default values..disable()
: Specify that the subcommand is disabled, if given with a bool value it will enable or disable the subcommand or option group..disabled_by_default()
: Specify that at the start of parsing the subcommand/option_group should be disabled. This is useful for allowing some Subcommands to trigger others..enabled_by_default()
: Specify that at the start of each parse the subcommand/option_group should be enabled. This is useful for allowing some Subcommands to disable others..silent()
: Specify that the subcommand is silent meaning that if used it won't show up in the subcommand list. This allows the use of subcommands as modifiers.validate_positionals()
: Specify that positionals should pass validation before matching. Validation is specified throughtransform
,check
, andeach
for an option. If an argument fails validation it is not an error and matching proceeds to the next available positional or extra arguments..validate_optional_arguments()
: Specify that optional arguments should pass validation before being assigned to an option. Validation is specified throughtransform
,check
, andeach
for an option. If an argument fails validation it is not an error and matching proceeds to the next available positional subcommand or extra arguments..excludes(option_or_subcommand)
: If given an option pointer or pointer to another subcommand, these subcommands cannot be given together. In the case of options, if the option is passed the subcommand cannot be used and will generate an error..needs(option_or_subcommand)
: If given an option pointer or pointer to another subcommand, the subcommands will require the given option to have been given before this subcommand is validated which occurs prior to execution of any callback or after parsing is completed..require_option()
: Require 1 or more options or option groups be used..require_option(N)
: RequireN
options or option groups, ifN>0
, or up toN
ifN<0
.N=0
resets to the default to 0 or more..require_option(min, max)
: Explicitly set min and max allowed options or option groups. Settingmax
to 0 implies unlimited options..require_subcommand()
: Require 1 or more subcommands..require_subcommand(N)
: RequireN
subcommands ifN>0
, or up toN
ifN<0
.N=0
resets to the default to 0 or more..require_subcommand(min, max)
: Explicitly set min and max allowed subcommands. Settingmax
to 0 is unlimited..add_subcommand(name="", description="")
: Add a subcommand, returns a pointer to the internally stored subcommand..add_subcommand(shared_ptr<App>)
: Add a subcommand by shared_ptr, returns a pointer to the internally stored subcommand..remove_subcommand(App)
: Remove a subcommand from the app or subcommand..got_subcommand(App_or_name)
: Check to see if a subcommand was received on the command line..get_subcommands(filter)
: The list of subcommands that match a particular filter function..add_option_group(name="", description="")
: Add an option group to an App, an option group is specialized subcommand intended for containing groups of options or other groups for controlling how options interact..get_parent()
: Get the parent App ornullptr
if called on main App..get_option(name)
: Get an option pointer by option name will throw if the specified option is not available, nameless subcommands are also searched.get_option_no_throw(name)
: Get an option pointer by option name. This function will return anullptr
instead of throwing if the option is not available..get_options(filter)
: Get the list of all defined option pointers (useful for processing the app for custom output formats)..parse_order()
: Get the list of option pointers in the order they were parsed (including duplicates)..formatter(fmt)
: Set a formatter, with signaturestd::string(const App*, std::string, AppFormatMode)
. See Formatting for more details..description(str)
: Set/change the description..get_description()
: Access the description..alias(str)
: set an alias for the subcommand, this allows subcommands to be called by more than one name..parsed()
: True if this subcommand was given on the command line..count()
: Returns the number of times the subcommand was called..count(option_name)
: Returns the number of times a particular option was called..count_all()
: Returns the total number of arguments a particular subcommand processed, on the main App it returns the total number of processed commands..name(name)
: Add or change the name..callback(void() function)
: Set the callback for an app. Either sets thepre_parse_callback
or thefinal_callback
depending on the value ofimmediate_callback
. See Subcommand callbacks for some additional details..parse_complete_callback(void() function)
: Set the callback that runs at the completion of parsing. For subcommands this is executed at the completion of the single subcommand and can be executed multiple times. See Subcommand callbacks for some additional details..final_callback(void() function)
: Set the callback that runs at the end of all processing. This is the last thing that is executed before returning. See Subcommand callbacks for some additional details..immediate_callback()
: Specifies whether the callback for a subcommand should be run as aparse_complete_callback
(true) orfinal_callback
(false). When used on the main app it will execute the main app callback prior to the callbacks for a subcommand if they do not also have theimmediate_callback
flag set. It is preferable to use theparse_complete_callback
orfinal_callback
directly instead of thecallback
andimmediate_callback
if one wishes to control the ordering and timing of callback. Thoughimmediate_callback
can be used to swap them if that is needed..pre_parse_callback(void(std::size_t) function)
: Set a callback that executes after the first argument of an application is processed. See Subcommand callbacks for some additional details..allow_extras()
: Do not throw an error if extra arguments are left over..positionals_at_end()
: Specify that positional arguments occur as the last arguments and throw an error if an unexpected positional is encountered..prefix_command()
: Likeallow_extras
, but stop processing immediately on the first unrecognized item. All subsequent arguments are placed in the remaining_arg list. It is ideal for allowing your app or subcommand to be a "prefix" to calling another app..usage(message)
: 🆕 Replace text to appear at the start of the help string after description..usage(std::string())
: 🆕 Set a callback to generate a string that will appear at the start of the help string after description..footer(message)
: Set text to appear at the bottom of the help string..footer(std::string())
: Set a callback to generate a string that will appear at the end of the help string..set_help_flag(name, message)
: Set the help flag name and message, returns a pointer to the created option..set_version_flag(name, versionString or callback, help_message)
: Set the version flag name and version string or callback and optional help message, returns a pointer to the created option..set_help_all_flag(name, message)
: Set the help all flag name and message, returns a pointer to the created option. Expands subcommands..failure_message(func)
: Set the failure message function. Two provided:CLI::FailureMessage::help
andCLI::FailureMessage::simple
(the default)..group(name)
: Set a group name, defaults to"Subcommands"
. Setting an empty string for the name will be hide the subcommand.[option_name]
: retrieve a const pointer to an option given byoption_name
for Exampleapp["--flag1"]
will get a pointer to the option for the "--flag1" value,app["--flag1"]->as<bool>()
will get the results of the command line for a flag. The operation will throw an exception if the option name is not valid.
[!NOTE]
If you have a fixed number of required positional options, that will match before subcommand names.
{}
is an empty filter function, and any positional argument will match before repeated subcommand names.
Callbacks
A subcommand has three optional callbacks that are executed at different stages
of processing. The preparse_callback
is executed once after the first argument
of a subcommand or application is processed and gives an argument for the number
of remaining arguments to process. For the main app the first argument is
considered the program name, for subcommands the first argument is the
subcommand name. For Option groups and nameless subcommands the first argument
is after the first argument or subcommand is processed from that group. The
second callback is executed after parsing. This is known as the
parse_complete_callback
. For subcommands this is executed immediately after
parsing and can be executed multiple times if a subcommand is called multiple
times. On the main app this callback is executed after all the
parse_complete_callback
s for the subcommands are executed but prior to any
final_callback
calls in the subcommand or option groups. If the main app or
subcommand has a config file, no data from the config file will be reflected in
parse_complete_callback
on named subcommands. For option_group
s the
parse_complete_callback
is executed prior to the parse_complete_callback
on
the main app but after the config_file
is loaded (if specified). The
final_callback
is executed after all processing is complete. After the
parse_complete_callback
is executed on the main app, the used subcommand
final_callback
are executed followed by the "final callback" for option
groups. The last thing to execute is the final_callback
for the main_app
.
For example say an application was set up like
app.parse_complete_callback(ac1);
app.final_callback(ac2);
auto sub1=app.add_subcommand("sub1")->parse_complete_callback(c1)->preparse_callback(pc1);
auto sub2=app.add_subcommand("sub2")->final_callback(c2)->preparse_callback(pc2);
app.preparse_callback( pa);
... A bunch of other options
Then the command line is given as
program --opt1 opt1_val sub1 --sub1opt --sub1optb val sub2 --sub2opt sub1 --sub1opt2 sub2 --sub2opt2 val
pa
will be called prior to parsing any values with an argument of 13.pc1
will be called immediately after processing thesub1
command with a value of 10.c1
will be called when thesub2
command is encountered.pc2
will be called with value of 6 after thesub2
command is encountered.c1
will be called again after the secondsub2
command is encountered.ac1
will be called after processing of all argumentsc2
will be called once after processing all arguments.ac2
will be called last after completing all lower level callbacks have been executed.
A subcommand is considered terminated when one of the following conditions are met.
- There are no more arguments to process
- Another subcommand is encountered that would not fit in an optional slot of the subcommand
- The
positional_mark
(--
) is encountered and there are no available positional slots in the subcommand. - The
subcommand_terminator
mark (++
) is encountered
Prior to executed a parse_complete_callback
all contained options are
processed before the callback is triggered. If a subcommand with a
parse_complete_callback
is called again, then the contained options are reset,
and can be triggered again.
Option groups
The subcommand method
.add_option_group(name,description)
Will create an option group, and return a pointer to it. The argument for
description
is optional and can be omitted. An option group allows creation of
a collection of options, similar to the groups function on options, but with
additional controls and requirements. They allow specific sets of options to be
composed and controlled as a collective. For an example see
range example.
Option groups are a specialization of an App so all
functions that work with an App or subcommand also work
on option groups. Options can be created as part of an option group using the
add functions just like a subcommand, or previously created options can be added
through. The name given in an option group must not contain newlines or null
characters.
ogroup->add_option(option_pointer);
ogroup->add_options(option_pointer);
ogroup->add_options(option1,option2,option3,...);
The option pointers used in this function must be options defined in the parent application of the option group otherwise an error will be generated. Subcommands can also be added via
ogroup->add_subcommand(subcom_pointer);
This results in the subcommand being moved from its parent into the option group.
Options in an option group are searched for a command line match after any
options in the main app, so any positionals in the main app would be matched
first. So care must be taken to make sure of the order when using positional
arguments and option groups. Option groups work well with excludes
and
require_options
methods, as an application will treat an option group as a
single option for the purpose of counting and requirements, and an option group
will be considered used if any of the options or subcommands contained in it are
used. Option groups allow specifying requirements such as requiring 1 of 3
options in one group and 1 of 3 options in a different group. Option groups can
contain other groups as well. Disabling an option group will turn off all
options within the group.
The CLI::TriggerOn
and CLI::TriggerOff
methods are helper functions to allow
the use of options/subcommands from one group to trigger another group on or
off.
CLI::TriggerOn(group1_pointer, triggered_group);
CLI::TriggerOff(group2_pointer, disabled_group);
These functions make use of preparse_callback
, enabled_by_default()
and
disabled_by_default
. The triggered group may be a vector of group pointers.
These methods should only be used once per group and will override any previous
use of the underlying functions. More complex arrangements can be accomplished
using similar methodology with a custom preparse_callback
function that does
more.
Additional helper functions deprecate_option
and retire_option
are available
to deprecate or retire options
CLI::deprecate_option(option *, replacement_name="");
CLI::deprecate_option(App,option_name,replacement_name="");
will specify that the option is deprecated which will display a message in the help and a warning on first usage. Deprecated options function normally but will add a message in the help and display a warning on first use.
CLI::retire_option(App,option *);
CLI::retire_option(App,option_name);
will create an option that does nothing by default and will display a warning on first usage that the option is retired and has no effect. If the option exists it is replaces with a dummy option that takes the same arguments.
If an empty string is passed the option group name the entire group will be hidden in the help results. For example.
auto hidden_group=app.add_option_group("");
will create a group such that no options in that group are displayed in the help string. For the purposes of help display, if the option group name starts with a '+' it is treated as if it were not in a group for help and get_options. For example:
auto added_group=app.add_option_group("+sub");
In this case the help output will not reference the option group and options inside of it will be treated for most purposes as if they were part of the parent.
Configuration file
app.set_config(option_name="",
default_file_name="",
help_string="Read an ini file",
required=false)
If this is called with no arguments, it will remove the configuration file
option (like set_help_flag
). Setting a configuration option is special. If it
is present, it will be read along with the normal command line arguments. The
file will be read if it exists, and does not throw an error unless required
is
true
. Configuration files are in TOML format by default, though the
default reader can also accept files in INI format as well. The config reader
can read most aspects of TOML files including strings both literal 🆕 and with
potential escape sequences 🆕, digit separators 🆕, and multi-line strings 🆕,
and run them through the CLI11 parser. Other formats can be added by an adept
user, some variations are available through customization points in the default
formatter. An example of a TOML file:
# Comments are supported, using a #
# The default section is [default], case insensitive
value = 1
value2 = 123_456 # a string with separators
str = "A string"
str2 = "A string\nwith new lines"
str3 = 'A literal "string"'
vector = [1,2,3]
str_vector = ["one","two","and three"]
# Sections map to subcommands
[subcommand]
in_subcommand = Wow
sub.subcommand = true
"sub"."subcommand2" = "string_value"
or equivalently in INI format
; Comments are supported, using a ;
; The default section is [default], case insensitive
value = 1
str = "A string"
vector = 1 2 3
str_vector = "one" "two" "and three"
; Sections map to subcommands
[subcommand]
in_subcommand = Wow
sub.subcommand = true
Spaces before and after the name and argument are ignored. Multiple arguments
are separated by spaces. One set of quotes will be removed, preserving spaces
(the same way the command line works). Boolean options can be true
, on
, 1
,
yes
, enable
; or false
, off
, 0
, no
, disable
(case insensitive).
Sections (and .
separated names) are treated as subcommands (note: this does
not necessarily mean that subcommand was passed, it just sets the "defaults").
You cannot set positional-only arguments. Subcommands can be triggered from
configuration files if the configurable
flag was set on the subcommand. Then
the use of [subcommand]
notation will trigger a subcommand and cause it to act
as if it were on the command line.
To print a configuration file from the passed arguments, use
.config_to_str(default_also=false, write_description=false)
, where
default_also
will also show any defaulted arguments, and write_description
will include the app and option descriptions. See
Config files for
some additional details and customization points.
If it is desired that multiple configuration be allowed. Use
app.set_config("--config")->expected(1, X);
Where X is some positive number and will allow up to X
configuration files to
be specified by separate --config
arguments. Value strings with quote
characters in it will be printed with a single quote. All other arguments will
use double quote. Empty strings will use a double quoted argument. Numerical or
boolean values are not quoted.
For options or flags which allow 0 arguments to be passed using an empty string
in the config file, {}
, or []
will convert the result to the default value
specified via default_str
or default_val
on the option. If no user specified
default is given the result is an empty string or the converted value of an
empty string.
NOTE: Transforms and checks can be used with the option pointer returned from
set_config like any other option to validate the input if needed. It can also be
used with the built in transform CLI::FileOnDefaultPath
to look in a default
path as well as the current one. For example
app.set_config("--config")->transform(CLI::FileOnDefaultPath("/to/default/path/"));
See Transforming Validators for additional details
on this validator. Multiple transforms or validators can be used either by
multiple calls or using |
operations with the transform.
Inheriting defaults
Many of the defaults for subcommands and even options are inherited from their
creators. The inherited default values for subcommands are allow_extras
,
prefix_command
, ignore_case
, ignore_underscore
, fallthrough
, group
,
usage
, footer
, immediate_callback
and maximum number of required
subcommands. The help flag existence, name, and description are inherited, as
well.
Options have defaults for group
, required
, multi_option_policy
,
ignore_case
, ignore_underscore
, delimiter
, and disable_flag_override
. To
set these defaults, you should set the option_defaults()
object, for example:
app.option_defaults()->required();
// All future options will be required
The default settings for options are inherited to subcommands, as well.
Formatting
The job of formatting help printouts is delegated to a formatter callable object
on Apps and Options. You are free to replace either formatter by calling
formatter(fmt)
on an App
, where fmt is any copyable callable with the
correct signature. CLI11 comes with a default App formatter functional,
Formatter
. It is customizable; you can set label(key, value)
to replace the
default labels like REQUIRED
, and column_width(n)
to set the width of the
columns before you add the functional to the app or option. You can also
override almost any stage of the formatting process in a subclass of either
formatter. If you want to make a new formatter from scratch, you can do that
too; you just need to implement the correct signature. The first argument is a
const pointer to the in question. The formatter will get a std::string
usage
name as the second option, and a AppFormatMode
mode for the final option. It
should return a std::string
.
The AppFormatMode
can be Normal
, All
, or Sub
, and it indicates the
situation the help was called in. Sub
is optional, but the default formatter
uses it to make sure expanded subcommands are called with their own formatter
since you can't access anything but the call operator once a formatter has been
set.
Subclassing
The App class was designed allow toolkits to subclass it, to provide preset
default options (see above) and setup/teardown code. Subcommands remain an
unsubclassed App
, since those are not expected to need setup and teardown. The
default App
only adds a help flag, -h,--help
, than can removed/replaced
using .set_help_flag(name, help_string)
. You can also set a help-all flag with
.set_help_all_flag(name, help_string)
; this will expand the subcommands (one
level only). You can remove options if you have pointers to them using
.remove_option(opt)
. You can add a pre_callback
override to customize the
after parse but before run behavior, while still giving the user freedom to
callback
on the main app.
The most important parse function is parse(std::vector<std::string>)
, which
takes a reversed list of arguments (so that pop_back
processes the args in the
correct order). get_help_ptr
and get_config_ptr
give you access to the
help/config option pointers. The standard parse
manually sets the name from
the first argument, so it should not be in this vector. You can also use
parse(string, bool)
to split up and parse a single string; the optional
boolean should be set to true if you are including the program name in the
string, and false otherwise. The program name can contain spaces if it is an
existing file, otherwise can be enclosed in quotes(single quote, double quote or
backtick). Embedded quote characters can be escaped with \
.
Also, in a related note, the App
you get a pointer to is stored in the parent
App
in a shared_ptr
s (similar to Option
s) and are deleted when the main
App
goes out of scope unless the object has another owner.
How it works
Every add_
option you have seen so far depends on one method that takes a
lambda function. Each of these methods is just making a different lambda
function with capture to populate the option. The function has full access to
the vector of strings, so it knows how many times an option was passed or how
many arguments it received. The lambda returns true
if it could validate the
option strings, and false
if it failed.
Other values can be added as long as they support operator>>
(and defaults can
be printed if they support operator<<
). To add a new type, for example,
provide a custom operator>>
with an istream
(inside the CLI namespace is
fine if you don't want to interfere with an existing operator>>
).
If you wanted to extend this to support a completely new type, use a lambda or
add an overload of the lexical_cast
function in the namespace of the type you
need to convert to. Some examples of some new parsers for complex<double>
that
support all of the features of a standard add_options
call are in
one of the tests. A simpler example is shown below:
app.add_option("--fancy-count", [](std::vector<std::string> val){
std::cout << "This option was given " << val.size() << " times." << std::endl;
return true;
});
Unicode support
CLI11 supports Unicode and wide strings as defined in the UTF-8 Everywhere manifesto. In particular:
- The library can parse a wide version of command-line arguments on Windows, which are converted internally to UTF-8 (more on this below);
- You can store option values in
std::wstring
, in which case they will be converted to a correct wide string encoding on your system (UTF-16 on Windows and UTF-32 on most other systems); - Instead of storing wide strings, it is recommended to use provided
widen
andnarrow
functions to convert to and from wide strings when actually necessary (such as when calling into Windows APIs).
When using the command line on Windows with unicode arguments, your main
function may already receive broken Unicode. Parsing argv
at that point will
not give you a correct string. To fix this, you have three options; the first is
recommended for cross-platform support:
1. Replace argv
with app.ensure_utf8(argv)
before any arguments are parsed.
ensure_utf8
will do nothing on systems where argv
is already in UTF-8 (Such
as Linux or macOS) and return argv
unmodified. On Windows, it will discard
argv
and replace it with a correctly decoded array or arguments from win32
API.
int main(int argc, char** argv) {
CLI::App app;
argv = app.ensure_utf8(argv); // new argv memory is held by app
// ...
CLI11_PARSE(app, argc, argv);
}
Be sure you do not modify argv
before this function call, as the correct
values will be reconstructed using Windows APIs and produced by this call. It
has no effect on other platforms and just passes through argv
.
2. Use the Windows-only non-standard wmain
function, which accepts
wchar_t *argv[]
instead of char* argv[]
. Parsing this will allow CLI to
convert wide strings to UTF-8 without losing information.
int wmain(int argc, wchar_t *argv[]) {
CLI::App app;
// ...
CLI11_PARSE(app, argc, argv);
}
3. Retrieve arguments yourself by using Windows APIs like
CommandLineToArgvW
and pass them to CLI. This is what the library is doing under the hood in
ensure_utf8
.
The library provides functions to convert between UTF-8 and wide strings:
namespace CLI {
std::string narrow(const std::wstring &str);
std::string narrow(const wchar_t *str);
std::string narrow(const wchar_t *str, std::size_t size);
std::string narrow(std::wstring_view str); // C++17
std::wstring widen(const std::string &str);
std::wstring widen(const char *str);
std::wstring widen(const char *str, std::size_t size);
std::wstring widen(std::string_view str); // C++17
}
Note on using Unicode paths
When creating a filesystem::path
from a UTF-8 path on Windows, you need to
convert it to a wide string first. CLI11 provides a platform-independent
to_path
function, which will convert a UTF-8 string to path, the right way:
std::string utf8_name = "Hello Halló Привет 你好 👩🚀❤️.txt";
std::filesystem::path p = CLI::to_path(utf8_name);
std::ifstream stream(CLI::to_path(utf8_name));
// etc.
Utilities
There are a few other utilities that are often useful in CLI programming. These
are in separate headers, and do not appear in CLI11.hpp
, but are completely
independent and can be used as needed. The Timer
/AutoTimer
class allows you
to easily time a block of code, with custom print output.
{
CLI::AutoTimer timer {"My Long Process", CLI::Timer::Big};
some_long_running_process();
}
This will create a timer with a title (default: Timer
), and will customize the
output using the predefined Big
output (default: Simple
). Because it is an
AutoTimer
, it will print out the time elapsed when the timer is destroyed at
the end of the block. If you use Timer
instead, you can use to_string
or
std::cout << timer << std::endl;
to print the time. The print function can be
any function that takes two strings, the title and the time, and returns a
formatted string for printing.
Other libraries
If you use the excellent Rang library to add color to your terminal in a safe, multi-platform way, you can combine it with CLI11 nicely:
std::atexit([](){std::cout << rang::style::reset;});
try {
app.parse(argc, argv);
} catch (const CLI::ParseError &e) {
std::cout << (e.get_exit_code()==0 ? rang::fg::blue : rang::fg::red);
return app.exit(e);
}
This will print help in blue, errors in red, and will reset before returning the terminal to the user.
If you are on a Unix-like system, and you'd like to handle control-c and color, you can add:
#include <csignal>
void signal_handler(int s) {
std::cout << std::endl << rang::style::reset << rang::fg::red << rang::fg::bold;
std::cout << "Control-C detected, exiting..." << rang::style::reset << std::endl;
std::exit(1); // will call the correct exit func, no unwinding of the stack though
}
And, in your main function:
// Nice Control-C
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = signal_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, nullptr);
API
The API is documented here. Also see the CLI11 tutorial GitBook.
Examples
Several short examples of different features are included in the repository. A brief description of each is included here
- arg_capture: Example of capturing all remaining arguments after a specific option, using subcommand and prefix_command() with an alias.
- callback_passthrough: Example of directly passing remaining arguments through to a callback function which generates a CLI11 application based on existing arguments.
- custom_parse: Based on Issue #566, example of custom parser
- digit_args: Based on Issue #123, uses digit flags to pass a value
- enum: Using enumerations in an option, and the use of CheckedTransformer
- enum_ostream: In addition to the contents of example enum.cpp, this example shows how a custom ostream operator overrides CLI11's enum streaming.
- formatter: Illustrating usage of a custom formatter
- groups: Example using groups of options for help grouping and a the timer helper class
- inter_argument_order: An app to practice mixing unlimited arguments, but still recover the original order.
- json: Using JSON as a config file parser
- modhelp: How to modify the help flag to do something other than default
- nested: Nested subcommands
- option_groups: Illustrating the use of option groups and a required number of options. Based on Issue #88 to set interacting groups of options
- positional_arity:
Illustrating use of
preparse_callback
to handle situations where the number of arguments can determine which should get parsed, Based on Issue #166 - positional_validation:
Example of how positional arguments are validated using the
validate_positional
flag, also based on Issue #166 - prefix_command:
Illustrating use of the
prefix_command
flag. - ranges: App to demonstrate exclusionary option groups based on Issue #88
- shapes: Illustrating how to set up repeated subcommands Based on gitter discussion
- simple: A simple example of how to set up a CLI11 Application with different flags and options
- subcom_help: Configuring help for subcommands
- subcom_partitioned: Example with a timer and subcommands generated separately and added to the main app later.
- subcommands: Short example of subcommands
- validators: Example illustrating use of validators
Contribute
To contribute, open an issue or pull request on GitHub, or ask a question on gitter. There is also a short note to contributors here. This readme roughly follows the Standard Readme Style and includes a mention of almost every feature of the library. More complex features are documented in more detail in the CLI11 tutorial GitBook.
This project was created by Henry Schreiner and major features were added by Philip Top. Special thanks to all the contributors (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!
License
As of version 1.0, this library is available under a 3-Clause BSD license. See the LICENSE file for details.
CLI11 was developed at the University of Cincinnati to support of the GooFit library under NSF Award 1414736. Version 0.9 was featured in a DIANA/HEP meeting at CERN (see the slides). Please give it a try! Feedback is always welcome.
More Resourcesto explore the angular.
mail [email protected] to add your project or resources here 🔥.
- 1Qt | Tools for Each Stage of Software Development Lifecycle
https://www.qt.io
All the essential Qt tools for all stages of Software Development Lifecycle: planning, design, development, testing, and deployment.
- 2Verovio
https://www.verovio.org
Music notation engraving library for MEI with MusicXML and Humdrum support and various toolkits (JavaScript, Python)
- 3Amplitude Audio SDK
https://amplitudeaudiosdk.com
A full-featured and cross-platform audio engine designed with the needs of games in mind.
- 4ISO C++ Standards Committee
https://github.com/cplusplus
ISO C++ Standards Committee has 30 repositories available. Follow their code on GitHub.
- 5Public development project of the LAMMPS MD software package
https://github.com/lammps/lammps
Public development project of the LAMMPS MD software package - GitHub - lammps/lammps: Public development project of the LAMMPS MD software package
- 6Small strings compression library
https://github.com/antirez/smaz
Small strings compression library. Contribute to antirez/smaz development by creating an account on GitHub.
- 7Fast, orthogonal, open multi-methods. Solve the Expression Problem in C++17.
https://github.com/jll63/yomm2
Fast, orthogonal, open multi-methods. Solve the Expression Problem in C++17. - jll63/yomm2
- 8simple neural network library in ANSI C
https://github.com/codeplea/genann
simple neural network library in ANSI C. Contribute to codeplea/genann development by creating an account on GitHub.
- 9Public/backup repository of the GROMACS molecular simulation toolkit. Please do not mine the metadata blindly; we use https://gitlab.com/gromacs/gromacs for code review and issue tracking.
https://github.com/gromacs/gromacs
Public/backup repository of the GROMACS molecular simulation toolkit. Please do not mine the metadata blindly; we use https://gitlab.com/gromacs/gromacs for code review and issue tracking. - gromac...
- 10A small self-contained alternative to readline and libedit that supports UTF-8 and Windows and is BSD licensed.
https://github.com/arangodb/linenoise-ng
A small self-contained alternative to readline and libedit that supports UTF-8 and Windows and is BSD licensed. - arangodb/linenoise-ng
- 11KFR | Fast, modern C++ DSP framework
https://www.kfrlib.com/
KFR | Fast, modern C++ DSP framework, DFT/FFT, Audio resampling, FIR, IIR and Biquad filters, Filter design, Tensors, Full vectorization
- 12LibU is a multiplatform utility library written in C, with APIs for handling memory allocation, networking and URI parsing, string manipulation, debugging, and logging in a very compact way, plus many other miscellaneous tasks
https://github.com/koanlogic/libu
LibU is a multiplatform utility library written in C, with APIs for handling memory allocation, networking and URI parsing, string manipulation, debugging, and logging in a very compact way, plus m...
- 13A header-only and easy to use Ini file parser for C++.
https://github.com/Rookfighter/inifile-cpp
A header-only and easy to use Ini file parser for C++. - Rookfighter/inifile-cpp
- 14libTorrent BitTorrent library
https://github.com/rakshasa/libtorrent
libTorrent BitTorrent library. Contribute to rakshasa/libtorrent development by creating an account on GitHub.
- 15SimplE Lossless Audio
https://github.com/sahaRatul/sela
SimplE Lossless Audio. Contribute to sahaRatul/sela development by creating an account on GitHub.
- 16Boost.org
https://github.com/boostorg
Boost provides free peer-reviewed portable C++ source libraries. - Boost.org
- 17The Official MongoDB driver for C language
https://github.com/mongodb/mongo-c-driver
The Official MongoDB driver for C language. Contribute to mongodb/mongo-c-driver development by creating an account on GitHub.
- 18The AI-native database built for LLM applications, providing incredibly fast hybrid search of dense vector, sparse vector, tensor (multi-vector), and full-text
https://github.com/infiniflow/infinity
The AI-native database built for LLM applications, providing incredibly fast hybrid search of dense vector, sparse vector, tensor (multi-vector), and full-text - infiniflow/infinity
- 19Simple Unit Testing for C
https://github.com/ThrowTheSwitch/Unity
Simple Unit Testing for C. Contribute to ThrowTheSwitch/Unity development by creating an account on GitHub.
- 20Basic Development Environment - a set of foundational C++ libraries used at Bloomberg.
https://github.com/bloomberg/bde
Basic Development Environment - a set of foundational C++ libraries used at Bloomberg. - bloomberg/bde
- 21C++14 evented IO libraries for high performance networking and media based applications
https://github.com/sourcey/libsourcey
C++14 evented IO libraries for high performance networking and media based applications - sourcey/libsourcey
- 22Asio C++ Library
https://github.com/chriskohlhoff/asio/
Asio C++ Library. Contribute to chriskohlhoff/asio development by creating an account on GitHub.
- 23A readline and libedit replacement that supports UTF-8, syntax highlighting, hints and Windows and is BSD licensed.
https://github.com/AmokHuginnsson/replxx
A readline and libedit replacement that supports UTF-8, syntax highlighting, hints and Windows and is BSD licensed. - AmokHuginnsson/replxx
- 24A lightweight header-only library for using Keras (TensorFlow) models in C++.
https://github.com/Dobiasd/frugally-deep
A lightweight header-only library for using Keras (TensorFlow) models in C++. - Dobiasd/frugally-deep
- 25A collection of std-like single-header C++ libraries
https://github.com/iboB/itlib
A collection of std-like single-header C++ libraries - iboB/itlib
- 26C++11 port of docopt
https://github.com/docopt/docopt.cpp
C++11 port of docopt. Contribute to docopt/docopt.cpp development by creating an account on GitHub.
- 27🎁 A glib-like multi-platform c library
https://github.com/tboox/tbox
🎁 A glib-like multi-platform c library. Contribute to tboox/tbox development by creating an account on GitHub.
- 28Audio decoding libraries for C/C++, each in a single source file.
https://github.com/mackron/dr_libs
Audio decoding libraries for C/C++, each in a single source file. - mackron/dr_libs
- 29Minimalistic MP3 decoder single header library
https://github.com/lieff/minimp3
Minimalistic MP3 decoder single header library. Contribute to lieff/minimp3 development by creating an account on GitHub.
- 30C library for cross-platform real-time audio input and output
https://github.com/andrewrk/libsoundio
C library for cross-platform real-time audio input and output - andrewrk/libsoundio
- 31header only, dependency-free deep learning framework in C++14
https://github.com/tiny-dnn/tiny-dnn
header only, dependency-free deep learning framework in C++14 - tiny-dnn/tiny-dnn
- 32Polycode is a cross-platform framework for creative code.
https://github.com/ivansafrin/Polycode
Polycode is a cross-platform framework for creative code. - ivansafrin/Polycode
- 33A simple C++ library for reading and writing audio files.
https://github.com/adamstark/AudioFile
A simple C++ library for reading and writing audio files. - adamstark/AudioFile
- 34An Open Source Implementation of the Actor Model in C++
https://github.com/actor-framework/actor-framework
An Open Source Implementation of the Actor Model in C++ - actor-framework/actor-framework
- 35Embedded Template Library
https://github.com/ETLCPP/etl
Embedded Template Library. Contribute to ETLCPP/etl development by creating an account on GitHub.
- 36analyzing petabytes of data, scientifically.
https://root.cern.ch/
An open-source data analysis framework used by high energy physics and others.
- 37Behavior Tree Starter Kit
https://github.com/aigamedev/btsk
Behavior Tree Starter Kit. Contribute to aigamedev/btsk development by creating an account on GitHub.
- 38C++ Parallel Computing and Asynchronous Networking Framework
https://github.com/sogou/workflow
C++ Parallel Computing and Asynchronous Networking Framework - sogou/workflow
- 39Open-Source Quantum Chemistry – an electronic structure package in C++ driven by Python
https://github.com/psi4/psi4
Open-Source Quantum Chemistry – an electronic structure package in C++ driven by Python - psi4/psi4
- 40The PGM-index
https://pgm.di.unipi.it
The Piecewise Geometric Model index (PGM-index) is a data structure that enables fast point and range searches in arrays of billions of items using orders of magnitude less space than traditional indexes.
- 41Hello from Velox | Velox
https://velox-lib.io/
Description will go into a meta tag in <head />
- 42A tiny boost library in C++11.
https://github.com/idealvin/coost
A tiny boost library in C++11. Contribute to idealvin/coost development by creating an account on GitHub.
- 43Minimal Rust-inspired C++20 STL replacement
https://github.com/TheNumbat/rpp
Minimal Rust-inspired C++20 STL replacement. Contribute to TheNumbat/rpp development by creating an account on GitHub.
- 44Concurrency library for C (coroutines)
https://github.com/tidwall/neco
Concurrency library for C (coroutines). Contribute to tidwall/neco development by creating an account on GitHub.
- 45Microsoft Cognitive Toolkit (CNTK), an open source deep-learning toolkit
https://github.com/Microsoft/CNTK
Microsoft Cognitive Toolkit (CNTK), an open source deep-learning toolkit - microsoft/CNTK
- 46A toolkit for making real world machine learning and data analysis applications in C++
https://github.com/davisking/dlib
A toolkit for making real world machine learning and data analysis applications in C++ - davisking/dlib
- 47A C++ static library offering a clean and simple interface to the 7-zip shared libraries.
https://github.com/rikyoz/bit7z
A C++ static library offering a clean and simple interface to the 7-zip shared libraries. - rikyoz/bit7z
- 48Kigs framework is a C++ modular multipurpose cross platform framework.
https://github.com/Kigs-framework/kigs
Kigs framework is a C++ modular multipurpose cross platform framework. - Kigs-framework/kigs
- 49Activity Indicators for Modern C++
https://github.com/p-ranav/indicators/
Activity Indicators for Modern C++. Contribute to p-ranav/indicators development by creating an account on GitHub.
- 50Open multi-methods for C++11
https://github.com/jll63/yomm11
Open multi-methods for C++11. Contribute to jll63/yomm11 development by creating an account on GitHub.
- 51A fast and flexible c++ template class for tree data structures
https://github.com/erikerlandson/st_tree
A fast and flexible c++ template class for tree data structures - erikerlandson/st_tree
- 52The most over-engineered C++ assertion library
https://github.com/jeremy-rifkin/libassert
The most over-engineered C++ assertion library. Contribute to jeremy-rifkin/libassert development by creating an account on GitHub.
- 53A powerful and cross-platform audio engine, optimized for games.
https://github.com/SparkyStudios/AmplitudeAudioSDK
A powerful and cross-platform audio engine, optimized for games. - SparkyStudios/AmplitudeAudioSDK
- 54Audio playback and capture library written in C, in a single source file.
https://github.com/mackron/miniaudio
Audio playback and capture library written in C, in a single source file. - mackron/miniaudio
- 55Boost.org asio module
https://github.com/boostorg/asio
Boost.org asio module. Contribute to boostorg/asio development by creating an account on GitHub.
- 56Free, easy, portable audio engine for games
https://github.com/jarikomppa/soloud
Free, easy, portable audio engine for games. Contribute to jarikomppa/soloud development by creating an account on GitHub.
- 57The project alpaka has moved to https://github.com/alpaka-group/alpaka
https://github.com/ComputationalRadiationPhysics/alpaka
The project alpaka has moved to https://github.com/alpaka-group/alpaka - ComputationalRadiationPhysics/alpaka
- 58BitTorrent DHT library
https://github.com/jech/dht
BitTorrent DHT library. Contribute to jech/dht development by creating an account on GitHub.
- 59An in-process SQL OLAP database management system
https://duckdb.org/
DuckDB is an in-process SQL OLAP database management system. Simple, feature-rich, fast & open source.
- 60Qt
https://github.com/qt
Official mirror of the qt-project.org Git repositories - Qt
- 61OpenCL - The Open Standard for Parallel Programming of Heterogeneous Systems
https://www.khronos.org/opencl/
OpenCL™ (Open Computing Language) is an open, royalty-free standard for cross-platform, parallel programming of diverse accelerators found in supercomputers, cloud servers, personal computers, mobile devices and embedded platforms. OpenCL greatly improves the speed and responsiveness of a wide spectrum of applications in numerous market categories including professional creative tools,
- 62Library and command line tool to detect SHA-1 collision in a file
https://github.com/cr-marcstevens/sha1collisiondetection
Library and command line tool to detect SHA-1 collision in a file - cr-marcstevens/sha1collisiondetection
- 63Concurrent data structures in C++
https://github.com/preshing/junction
Concurrent data structures in C++. Contribute to preshing/junction development by creating an account on GitHub.
- 64EASTL stands for Electronic Arts Standard Template Library. It is an extensive and robust implementation that has an emphasis on high performance.
https://github.com/electronicarts/EASTL
EASTL stands for Electronic Arts Standard Template Library. It is an extensive and robust implementation that has an emphasis on high performance. - electronicarts/EASTL
- 65【A common used C++ DAG framework】 一个通用的、无三方依赖的、跨平台的、收录于awesome-cpp的、基于流图的并行计算框架。欢迎star & fork & 交流
https://github.com/ChunelFeng/CGraph
【A common used C++ DAG framework】 一个通用的、无三方依赖的、跨平台的、收录于awesome-cpp的、基于流图的并行计算框架。欢迎star & fork & 交流 - ChunelFeng/CGraph
- 66Industry-standard navigation-mesh toolset for games
https://github.com/recastnavigation/recastnavigation
Industry-standard navigation-mesh toolset for games - recastnavigation/recastnavigation
- 67C++20 Microservice Bootstrapping Framework
https://github.com/volt-software/ichor
C++20 Microservice Bootstrapping Framework. Contribute to volt-software/Ichor development by creating an account on GitHub.
- 68LZFSE compression library and command line tool
https://github.com/lzfse/lzfse
LZFSE compression library and command line tool. Contribute to lzfse/lzfse development by creating an account on GitHub.
- 69Boost.org program_options module
https://github.com/boostorg/program_options
Boost.org program_options module. Contribute to boostorg/program_options development by creating an account on GitHub.
- 70Argument Parser for Modern C++
https://github.com/p-ranav/argparse
Argument Parser for Modern C++. Contribute to p-ranav/argparse development by creating an account on GitHub.
- 71A curses library for environments that don't fit the termcap/terminfo model.
https://github.com/wmcbrine/PDCurses
A curses library for environments that don't fit the termcap/terminfo model. - wmcbrine/PDCurses
- 72Easy and efficient audio synthesis in C++
https://github.com/TonicAudio/Tonic
Easy and efficient audio synthesis in C++. Contribute to TonicAudio/Tonic development by creating an account on GitHub.
- 73The Massively Parallel Quantum Chemistry program, MPQC, computes properties of atoms and molecules from first principles using the time independent Schrödinger equation.
https://github.com/ValeevGroup/mpqc
The Massively Parallel Quantum Chemistry program, MPQC, computes properties of atoms and molecules from first principles using the time independent Schrödinger equation. - ValeevGroup/mpqc
- 74A library for audio and music analysis, feature extraction.
https://github.com/libAudioFlux/audioFlux
A library for audio and music analysis, feature extraction. - libAudioFlux/audioFlux
- 75C++ Audio and Music DSP Library
https://github.com/micknoise/Maximilian
C++ Audio and Music DSP Library. Contribute to micknoise/Maximilian development by creating an account on GitHub.
- 76Thin, unified, C++-flavored wrappers for the CUDA APIs
https://github.com/eyalroz/cuda-api-wrappers
Thin, unified, C++-flavored wrappers for the CUDA APIs - eyalroz/cuda-api-wrappers
- 77a unified framework for modeling chemically reactive systems
https://github.com/reaktoro/reaktoro
a unified framework for modeling chemically reactive systems - reaktoro/reaktoro
- 78ImTui: Immediate Mode Text-based User Interface C++ Library
https://github.com/ggerganov/imtui
ImTui: Immediate Mode Text-based User Interface C++ Library - ggerganov/imtui
- 79Library for writing text-based user interfaces
https://github.com/nsf/termbox
Library for writing text-based user interfaces. Contribute to nsf/termbox development by creating an account on GitHub.
- 80A simple to use, composable, command line parser for C++ 11 and beyond
https://github.com/bfgroup/Lyra
A simple to use, composable, command line parser for C++ 11 and beyond - bfgroup/Lyra
- 81MariadeAnton/MiLi
https://github.com/MariadeAnton/MiLi
Contribute to MariadeAnton/MiLi development by creating an account on GitHub.
- 82Distributed machine learning platform
https://github.com/Samsung/veles
Distributed machine learning platform. Contribute to Samsung/veles development by creating an account on GitHub.
- 83The project alpaka has moved to https://github.com/alpaka-group/cupla
https://github.com/ComputationalRadiationPhysics/cupla
The project alpaka has moved to https://github.com/alpaka-group/cupla - GitHub - ComputationalRadiationPhysics/cupla: The project alpaka has moved to https://github.com/alpaka-group/cupla
- 84Open Source Document-oriented DB
https://reindexer.io/
Free NoSQL in-memory database with web interface
- 85A general-purpose lightweight C++ graph library
https://github.com/bobluppes/graaf
A general-purpose lightweight C++ graph library. Contribute to bobluppes/graaf development by creating an account on GitHub.
- 86A C++ vectorized database acceleration library aimed to optimizing query engines and data processing systems.
https://github.com/facebookincubator/velox
A C++ vectorized database acceleration library aimed to optimizing query engines and data processing systems. - facebookincubator/velox
- 87Cross-platform asynchronous I/O
https://github.com/libuv/libuv
Cross-platform asynchronous I/O. Contribute to libuv/libuv development by creating an account on GitHub.
- 88an efficient feature complete C++ bittorrent implementation
https://github.com/arvidn/libtorrent
an efficient feature complete C++ bittorrent implementation - arvidn/libtorrent
- 89A small self-contained alternative to readline and libedit
https://github.com/antirez/linenoise
A small self-contained alternative to readline and libedit - antirez/linenoise
- 90Simple and yet powerful cross-platform C library providing data structures, algorithms and much more
https://github.com/kala13x/libxutils
Simple and yet powerful cross-platform C library providing data structures, algorithms and much more - kala13x/libxutils
- 91Lightweight C++ command line option parser
https://github.com/jarro2783/cxxopts
Lightweight C++ command line option parser. Contribute to jarro2783/cxxopts development by creating an account on GitHub.
- 92uTorrent Transport Protocol library
https://github.com/bittorrent/libutp
uTorrent Transport Protocol library. Contribute to bittorrent/libutp development by creating an account on GitHub.
- 93A better and stronger spiritual successor to BZip2.
https://github.com/kspalaiologos/bzip3
A better and stronger spiritual successor to BZip2. - kspalaiologos/bzip3
- 94Abseil Common Libraries (C++)
https://github.com/abseil/abseil-cpp
Abseil Common Libraries (C++). Contribute to abseil/abseil-cpp development by creating an account on GitHub.
- 95Brotli compression format
https://github.com/google/brotli
Brotli compression format. Contribute to google/brotli development by creating an account on GitHub.
- 96NI Media is a C++ library for reading and writing audio streams.
https://github.com/NativeInstruments/ni-media
NI Media is a C++ library for reading and writing audio streams. - NativeInstruments/ni-media
- 97Multiresolution Adaptive Numerical Environment for Scientific Simulation
https://github.com/m-a-d-n-e-s-s/madness
Multiresolution Adaptive Numerical Environment for Scientific Simulation - m-a-d-n-e-s-s/madness
- 98Zstandard - Fast real-time compression algorithm
https://github.com/facebook/zstd
Zstandard - Fast real-time compression algorithm. Contribute to facebook/zstd development by creating an account on GitHub.
- 99Multi-format archive and compression library
https://github.com/libarchive/libarchive
Multi-format archive and compression library. Contribute to libarchive/libarchive development by creating an account on GitHub.
- 100Structural variant detection and association testing
https://github.com/zeeev/wham
Structural variant detection and association testing - zeeev/wham
- 101Thread-safe container for sharing data between threads
https://github.com/andreiavrammsd/cpp-channel
Thread-safe container for sharing data between threads - andreiavrammsd/cpp-channel
- 102data compression library for embedded/real-time systems
https://github.com/atomicobject/heatshrink
data compression library for embedded/real-time systems - atomicobject/heatshrink
- 103The libdispatch Project, (a.k.a. Grand Central Dispatch), for concurrency on multicore hardware
https://github.com/apple/swift-corelibs-libdispatch
The libdispatch Project, (a.k.a. Grand Central Dispatch), for concurrency on multicore hardware - apple/swift-corelibs-libdispatch
- 104Async++ concurrency framework for C++11
https://github.com/Amanieu/asyncplusplus
Async++ concurrency framework for C++11. Contribute to Amanieu/asyncplusplus development by creating an account on GitHub.
- 105THIS REPOSITORY HAS MOVED TO github.com/nvidia/cub, WHICH IS AUTOMATICALLY MIRRORED HERE.
https://github.com/NVlabs/cub
THIS REPOSITORY HAS MOVED TO github.com/nvidia/cub, WHICH IS AUTOMATICALLY MIRRORED HERE. - NVlabs/cub
- 106OpenCL based GPU accelerated SPH fluid simulation library
https://github.com/libclsph/libclsph
OpenCL based GPU accelerated SPH fluid simulation library - libclsph/libclsph
- 107High performance server-side application framework
https://github.com/scylladb/seastar
High performance server-side application framework - scylladb/seastar
- 108Fast lossless data compression in C++
https://github.com/flanglet/kanzi-cpp
Fast lossless data compression in C++. Contribute to flanglet/kanzi-cpp development by creating an account on GitHub.
- 109miniz: Single C source file zlib-replacement library, originally from code.google.com/p/miniz
https://github.com/richgel999/miniz
miniz: Single C source file zlib-replacement library, originally from code.google.com/p/miniz - richgel999/miniz
- 110A C++ GPU Computing Library for OpenCL
https://github.com/boostorg/compute
A C++ GPU Computing Library for OpenCL. Contribute to boostorg/compute development by creating an account on GitHub.
- 111CLI11 is a command line parser for C++11 and beyond that provides a rich feature set with a simple and intuitive interface.
https://github.com/CLIUtils/CLI11
CLI11 is a command line parser for C++11 and beyond that provides a rich feature set with a simple and intuitive interface. - CLIUtils/CLI11
- 112Fork of the popular zip manipulation library found in the zlib distribution.
https://github.com/zlib-ng/minizip-ng
Fork of the popular zip manipulation library found in the zlib distribution. - zlib-ng/minizip-ng
- 113A text-based widget toolkit
https://github.com/gansm/finalcut
A text-based widget toolkit. Contribute to gansm/finalcut development by creating an account on GitHub.
- 114Argh! A minimalist argument handler.
https://github.com/adishavit/argh
Argh! A minimalist argument handler. Contribute to adishavit/argh development by creating an account on GitHub.
- 115C++17 Terminal User Interface(TUI) Library.
https://github.com/a-n-t-h-o-n-y/TermOx
C++17 Terminal User Interface(TUI) Library. Contribute to a-n-t-h-o-n-y/TermOx development by creating an account on GitHub.
- 116A fast, memory efficient hash map for C++
https://github.com/greg7mdp/sparsepp
A fast, memory efficient hash map for C++. Contribute to greg7mdp/sparsepp development by creating an account on GitHub.
- 117oneAPI Deep Neural Network Library (oneDNN)
https://github.com/oneapi-src/oneDNN
oneAPI Deep Neural Network Library (oneDNN). Contribute to oneapi-src/oneDNN development by creating an account on GitHub.
- 118New generation entropy codecs : Finite State Entropy and Huff0
https://github.com/Cyan4973/FiniteStateEntropy
New generation entropy codecs : Finite State Entropy and Huff0 - Cyan4973/FiniteStateEntropy
- 119Convenient, high-performance RGB color and position control for console output
https://github.com/s9w/oof
Convenient, high-performance RGB color and position control for console output - s9w/oof
- 120Extremely Fast Compression algorithm
https://github.com/lz4/lz4
Extremely Fast Compression algorithm. Contribute to lz4/lz4 development by creating an account on GitHub.
- 121Sane C++ Libraries
https://github.com/Pagghiu/SaneCppLibraries
Sane C++ Libraries. Contribute to Pagghiu/SaneCppLibraries development by creating an account on GitHub.
- 122Header-only, event based, tiny and easy to use libuv wrapper in modern C++ - now available as also shared/static library!
https://github.com/skypjack/uvw
Header-only, event based, tiny and easy to use libuv wrapper in modern C++ - now available as also shared/static library! - skypjack/uvw
- 123Bolt is a C++ template library optimized for GPUs. Bolt provides high-performance library implementations for common algorithms such as scan, reduce, transform, and sort.
https://github.com/HSA-Libraries/Bolt
Bolt is a C++ template library optimized for GPUs. Bolt provides high-performance library implementations for common algorithms such as scan, reduce, transform, and sort. - HSA-Libraries/Bolt
- 124Framework for Enterprise Application Development in c++, HTTP1/HTTP2/HTTP3 compliant, Supports multiple server backends
https://github.com/sumeetchhetri/ffead-cpp
Framework for Enterprise Application Development in c++, HTTP1/HTTP2/HTTP3 compliant, Supports multiple server backends - GitHub - sumeetchhetri/ffead-cpp: Framework for Enterprise Application De...
- 125An Open Source Machine Learning Framework for Everyone
https://github.com/tensorflow/tensorflow
An Open Source Machine Learning Framework for Everyone - tensorflow/tensorflow
- 126The C++ Standard Library for Parallelism and Concurrency
https://github.com/STEllAR-GROUP/hpx/
The C++ Standard Library for Parallelism and Concurrency - STEllAR-GROUP/hpx
- 127ArrayFire: a general purpose GPU library.
https://github.com/arrayfire/arrayfire
ArrayFire: a general purpose GPU library. Contribute to arrayfire/arrayfire development by creating an account on GitHub.
- 128Kokkos C++ Performance Portability Programming Ecosystem: The Programming Model - Parallel Execution and Memory Abstraction
https://github.com/kokkos/kokkos
Kokkos C++ Performance Portability Programming Ecosystem: The Programming Model - Parallel Execution and Memory Abstraction - kokkos/kokkos
- 129kaldi-asr/kaldi is the official location of the Kaldi project.
https://github.com/kaldi-asr/kaldi
kaldi-asr/kaldi is the official location of the Kaldi project. - kaldi-asr/kaldi
- 130Concurrency primitives, safe memory reclamation mechanisms and non-blocking (including lock-free) data structures designed to aid in the research, design and implementation of high performance concurrent systems developed in C99+.
https://github.com/concurrencykit/ck
Concurrency primitives, safe memory reclamation mechanisms and non-blocking (including lock-free) data structures designed to aid in the research, design and implementation of high performance conc...
- 131A C++ library of Concurrent Data Structures
https://github.com/khizmax/libcds
A C++ library of Concurrent Data Structures. Contribute to khizmax/libcds development by creating an account on GitHub.
- 132Header-only C++ program options parser library
https://github.com/badaix/popl
Header-only C++ program options parser library. Contribute to badaix/popl development by creating an account on GitHub.
- 133Gzip Decompression and Random Access for Modern Multi-Core Machines
https://github.com/mxmlnkn/rapidgzip
Gzip Decompression and Random Access for Modern Multi-Core Machines - mxmlnkn/rapidgzip
- 134C++ library for writing multiplatform terminal applications
https://github.com/jupyter-xeus/cpp-terminal
C++ library for writing multiplatform terminal applications - jupyter-xeus/cpp-terminal
- 135🔥 比libevent/libuv/asio更易用的网络库。A c/c++ network library for developing TCP/UDP/SSL/HTTP/WebSocket/MQTT client/server.
https://github.com/ithewei/libhv
🔥 比libevent/libuv/asio更易用的网络库。A c/c++ network library for developing TCP/UDP/SSL/HTTP/WebSocket/MQTT client/server. - ithewei/libhv
- 136Developer-friendly Continuous Regression Testing
https://touca.io/
Touca is a continuous regression testing solution that helps software engineering teams gain confidence in their daily code changes.
- 137delta3d Open Source Engine
http://sourceforge.net/projects/delta3d/
Download delta3d Open Source Engine for free. Sorry this project is no longer being supported. This project is not currently being supported but feel free to use it as an example. delta3d is a robust simulation platform built using open standards and open source software.
- 138raftlib.io
http://raftlib.io/
Simple, easy to use stream computation library for C++.
- 139googletest/googlemock/README.md at main · google/googletest
https://github.com/google/googletest/blob/master/googlemock/README.md
GoogleTest - Google Testing and Mocking Framework. Contribute to google/googletest development by creating an account on GitHub.
- 140oneAPI DPC++ Library (oneDPL) https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/dpc-library.html
https://github.com/intel/parallelstl
oneAPI DPC++ Library (oneDPL) https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/dpc-library.html - GitHub - oneapi-src/oneDPL: oneAPI DPC++ Library (oneDPL) https://soft...
- 141Fork of the popular zip manipulation library found in the zlib distribution.
https://github.com/nmoinvaz/minizip
Fork of the popular zip manipulation library found in the zlib distribution. - zlib-ng/minizip-ng
- 142The fastest feature-rich C++11/14/17/20/23 single-header testing framework
https://github.com/onqtam/doctest
The fastest feature-rich C++11/14/17/20/23 single-header testing framework - doctest/doctest
- 143Lightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more
https://github.com/apache/incubator-mxnet
Lightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more - apache/mxnet
- 144C++React: A reactive programming library for C++11.
https://github.com/schlangster/cpp.react
C++React: A reactive programming library for C++11. - snakster/cpp.react
- 145An eventing framework for building high performance and high scalability systems in C.
https://github.com/facebook/libphenom
An eventing framework for building high performance and high scalability systems in C. - facebookarchive/libphenom
- 146Facebook AI Research's Automatic Speech Recognition Toolkit
https://github.com/facebookresearch/wav2letter/
Facebook AI Research's Automatic Speech Recognition Toolkit - GitHub - flashlight/wav2letter: Facebook AI Research's Automatic Speech Recognition Toolkit
- 147C++ library and cmdline tools for parsing and manipulating VCF files with python and zig bindings
https://github.com/ekg/vcflib
C++ library and cmdline tools for parsing and manipulating VCF files with python and zig bindings - vcflib/vcflib
- 148🎵 Music notation engraving library for MEI with MusicXML and Humdrum support and various toolkits (JavaScript, Python)
https://github.com/rism-ch/verovio
🎵 Music notation engraving library for MEI with MusicXML and Humdrum support and various toolkits (JavaScript, Python) - rism-digital/verovio
- 149A C library for reading and writing sound files containing sampled audio data.
https://github.com/erikd/libsndfile/
A C library for reading and writing sound files containing sampled audio data. - libsndfile/libsndfile
- 150JUCE is an open-source cross-platform C++ application framework for desktop and mobile applications, including VST, VST3, AU, AUv3, LV2 and AAX audio plug-ins.
https://github.com/julianstorer/JUCE
JUCE is an open-source cross-platform C++ application framework for desktop and mobile applications, including VST, VST3, AU, AUv3, LV2 and AAX audio plug-ins. - juce-framework/JUCE
- 151Chaste
http://www.cs.ox.ac.uk/chaste/
Chaste
- 152raylib
http://www.raylib.com/
raylib is a simple and easy-to-use library to enjoy videogames programming.
- 153Open Ecosystem
https://01.org/onednn
Access technologies from partnerships with the community and leaders. Everything open source at Intel. We have a lot to share and a lot to learn.
- 154oneAPI Threading Building Blocks (oneTBB)
https://www.threadingbuildingblocks.org/
oneAPI Threading Building Blocks (oneTBB). Contribute to oneapi-src/oneTBB development by creating an account on GitHub.
- 155Home - OpenMP
http://openmp.org/
yes
- 156TileDB -The Modern Database
https://tiledb.io/
TileDB is the modern data stack in a box. All data, code, and compute in a single product.
- 157PLATINUMTOTO | SITUS JUDI SLOT GACOR SERVER RUSIA AUTO MAXWIN!!!
http://cmldev.net/
PLATINUMTOTO adalah situs judi slot gacor maxwin server RUSIA, yang memberikan pengalaman berjudi slot gacor gampang menang auto maxwin!!!
- 158A fast image processing library with low memory needs.
http://www.vips.ecs.soton.ac.uk/
A fast image processing library with low memory needs. - libvips/libvips
- 159Home
http://opencv.org/
OpenCV provides a real-time optimized Computer Vision library, tools, and hardware. It also supports model execution for Machine Learning (ML) and Artificial Intelligence (AI).
- 160libjson
http://sourceforge.net/projects/libjson/
Download libjson for free. A JSON reader and writer which is super-effiecient and usually runs circles around other JSON libraries. It's highly customizable to optimize for your particular project, and very lightweight.
- 161The GTK Project - A free and open-source cross-platform widget toolkit
http://www.gtk.org/
GTK is a free and open-source cross-platform widget toolkit for creating graphical user interfaces.
- 162Magnum Engine
http://magnum.graphics
Lightweight and modular C++11/C++14 graphics middleware for games and data visualization
- 163Panda3D | Open Source Framework for 3D Rendering & Games
http://www.panda3d.org/
Panda3D is an open-source, cross-platform, completely free-to-use engine for realtime 3D games, visualizations, simulations, experiments — you name it! Its rich feature set readily tailors to your specific workflow and development needs.
- 164ICU - International Components for Unicode
http://site.icu-project.org/
News 2024-04-17: ICU 75 is now available. It updates to CLDR 45 (beta blog) locale data with new locales and various additions and corrections. C++ code now requires C++17 and is being made more robust. The CLDR MessageFormat 2.0 specification is now in technology preview, together with a
- 165gRPC
http://www.grpc.io/
A high-performance, open source universal RPC framework
- 166CrowCpp
https://crowcpp.org
A Fast and Easy to use microframework for the web.
- 167Meeting Cpp
https://www.youtube.com/user/MeetingCPP/videos
Meeting C++ is an independent platform for C++, supporting the C++ community by sharing news, blogs and events for C++. Details on the yearly Meeting C++ Conference can be found on the website https://meetingcpp.com
- 168A sort wrapper enabling both use of random-access sorting on non-random access containers, and increased performance for the sorting of large types.
https://github.com/mattreecebentley/plf_indiesort
A sort wrapper enabling both use of random-access sorting on non-random access containers, and increased performance for the sorting of large types. - mattreecebentley/plf_indiesort
- 169Open Watcom V2
https://github.com/open-watcom
Open Watcom V2 has 6 repositories available. Follow their code on GitHub.
- 170CppCon
https://www.youtube.com/user/CppCon/videos
Visit cppcon.org for details on next year's conference. CppCon sponsors have made it possible to record and freely distribute over 1000 sessions from the first CppCon in 2014 to the present. We hope you enjoy them!
- 171Protocol Buffers implementation in C
https://github.com/protobuf-c/protobuf-c
Protocol Buffers implementation in C. Contribute to protobuf-c/protobuf-c development by creating an account on GitHub.
- 172C++ GUI with Qt Playlist
https://www.youtube.com/playlist?list=PLD0D54219E5F2544D
Official Playlist for thenewboston C++ GUI with Qt tutorials!
- 173ZXing ("Zebra Crossing") barcode scanning library for Java, Android
https://github.com/zxing/zxing/
ZXing ("Zebra Crossing") barcode scanning library for Java, Android - zxing/zxing
- 174A YAML parser and emitter in C++
https://github.com/jbeder/yaml-cpp
A YAML parser and emitter in C++. Contribute to jbeder/yaml-cpp development by creating an account on GitHub.
- 175"interesting" VM in C. Let's see how this goes.
https://github.com/tekknolagi/carp
"interesting" VM in C. Let's see how this goes. Contribute to tekknolagi/carp development by creating an account on GitHub.
- 176Boost.org serialization module
https://github.com/boostorg/serialization
Boost.org serialization module. Contribute to boostorg/serialization development by creating an account on GitHub.
- 177Parsing Expression Grammar Template Library
https://github.com/taocpp/PEGTL
Parsing Expression Grammar Template Library. Contribute to taocpp/PEGTL development by creating an account on GitHub.
- 178A C++ Discord API Library for Bots - D++ - The lightweight C++ Discord API Library
https://dpp.dev
A lightweight C++ Discord API library supporting the entire Discord API, including Slash Commands, Voice/Audio, Sharding, Clustering and more!
- 179Full C++17 course
https://www.youtube.com/playlist?list=PLwhKb0RIaIS1sJkejUmWj-0lk7v_xgCuT
This playlist covers what one needs to know about coding in C++ 17. We start with a program that prints the "hello world" to screen and progressively dive in...
- 180Asio C++ Library
https://github.com/chriskohlhoff/asio/
Asio C++ Library. Contribute to chriskohlhoff/asio development by creating an account on GitHub.
- 181Single header YAML 1.0 C++11 serializer/deserializer.
https://github.com/jimmiebergmann/mini-yaml
Single header YAML 1.0 C++11 serializer/deserializer. - jimmiebergmann/mini-yaml
- 182C++ Programming Tutorials Playlist
https://www.youtube.com/playlist?list=PLAE85DE8440AA6B83
thenewboston Official Buckys C++ Programming Tutorials Playlist!
- 183Slides and other materials from CppCon 2020
https://github.com/CppCon/CppCon2020
Slides and other materials from CppCon 2020. Contribute to CppCon/CppCon2020 development by creating an account on GitHub.
- 184Eric Niebler
http://ericniebler.com/
Judge me by my C++, not my WordPress
- 185C++ Library Manager for Windows, Linux, and MacOS
https://github.com/microsoft/vcpkg
C++ Library Manager for Windows, Linux, and MacOS. Contribute to microsoft/vcpkg development by creating an account on GitHub.
- 186C++ Programming Tutorials from thenewboston
https://www.youtube.com/playlist?list=PLF541C2C1F671AEF6
These are all of my C++ programming tutorials
- 187libsigc++ implements a typesafe callback system for standard C++. It allows you to define signals and to connect those signals to any callback function, either global or a member function, regardless of whether it is static or virtual.
https://github.com/libsigcplusplus/libsigcplusplus
libsigc++ implements a typesafe callback system for standard C++. It allows you to define signals and to connect those signals to any callback function, either global or a member function, regardle...
- 188Cross-platform, Serial Port library written in C++
https://github.com/wjwwood/serial
Cross-platform, Serial Port library written in C++ - wjwwood/serial
- 189C Programming Tutorials
https://www.youtube.com/playlist?list=PL78280D6BE6F05D34
All if my C programming tutorials are right here!
- 190Bo Qian
https://www.youtube.com/user/BoQianTheProgrammer/playlists
The purpose of this channel is to teach various C++ programming topics in a short video format. You are welcomed to provide feedbacks so I can constantly improve the videos.
- 191a small C library for x86 CPU detection and feature extraction
https://github.com/anrieff/libcpuid
a small C library for x86 CPU detection and feature extraction - anrieff/libcpuid
- 192Awesome C Programming Tutorials in Hi Def [HD]
https://www.youtube.com/playlist?list=PLCB9F975ECF01953C
This is a collection of detailed C Programming Language Tutorials for Beginners and New Programmers. If you go through these tutorials you should have a fair...
- 193Catalog of C++ conferences worldwide
https://github.com/eoan-ermine/cpp-conferences
Catalog of C++ conferences worldwide. Contribute to eoan-ermine/cpp-conferences development by creating an account on GitHub.
- 194C++ package retrieval
https://github.com/pfultz2/cget
C++ package retrieval. Contribute to pfultz2/cget development by creating an account on GitHub.
- 195Slides and other materials from CppCon 2017
https://github.com/CppCon/CppCon2017
Slides and other materials from CppCon 2017. Contribute to CppCon/CppCon2017 development by creating an account on GitHub.
- 196A C++14 cheat-sheet on lvalues, rvalues, xvalues, and more
https://github.com/jeaye/value-category-cheatsheet
A C++14 cheat-sheet on lvalues, rvalues, xvalues, and more - jeaye/value-category-cheatsheet
- 197C++ Faker library for generating fake (but realistic) data.
https://github.com/cieslarmichal/faker-cxx
C++ Faker library for generating fake (but realistic) data. - cieslarmichal/faker-cxx
- 198NIH Utility Library
https://github.com/keybuk/libnih
NIH Utility Library. Contribute to keybuk/libnih development by creating an account on GitHub.
- 199Yet Another Serialization
https://github.com/niXman/yas
Yet Another Serialization. Contribute to niXman/yas development by creating an account on GitHub.
- 200A C++11 library for serialization
https://github.com/USCiLab/cereal
A C++11 library for serialization. Contribute to USCiLab/cereal development by creating an account on GitHub.
- 201A C++ header-only parser for the PLY file format. Parse .ply happily!
https://github.com/nmwsharp/happly
A C++ header-only parser for the PLY file format. Parse .ply happily! - nmwsharp/happly
- 202TinyVM is a small, fast, lightweight virtual machine written in pure ANSI C.
https://github.com/jakogut/tinyvm
TinyVM is a small, fast, lightweight virtual machine written in pure ANSI C. - jakogut/tinyvm
- 203TinyXML2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs.
https://github.com/leethomason/tinyxml2
TinyXML2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs. - leethomason/tinyxml2
- 204A safe and fast high-level and low-level character input/output library for bare-metal and RTOS based embedded systems with a very small binary footprint.
https://github.com/Viatorus/emio
A safe and fast high-level and low-level character input/output library for bare-metal and RTOS based embedded systems with a very small binary footprint. - Viatorus/emio
- 205Open Source H.264 Codec
https://github.com/cisco/openh264
Open Source H.264 Codec . Contribute to cisco/openh264 development by creating an account on GitHub.
- 206A header-only library for C++(0x) that allows automagic pretty-printing of any container.
https://github.com/louisdx/cxx-prettyprint
A header-only library for C++(0x) that allows automagic pretty-printing of any container. - louisdx/cxx-prettyprint
- 207gcc-poison
https://github.com/leafsr/gcc-poison
gcc-poison. Contribute to leafsr/gcc-poison development by creating an account on GitHub.
- 208Boost.org asio module
https://github.com/boostorg/asio
Boost.org asio module. Contribute to boostorg/asio development by creating an account on GitHub.
- 209Bond is a cross-platform framework for working with schematized data. It supports cross-language de/serialization and powerful generic mechanisms for efficiently manipulating data. Bond is broadly used at Microsoft in high scale services.
https://github.com/Microsoft/bond
Bond is a cross-platform framework for working with schematized data. It supports cross-language de/serialization and powerful generic mechanisms for efficiently manipulating data. Bond is broadly ...
- 210A fast, portable, simple, and free C/C++ IDE
https://github.com/Embarcadero/Dev-Cpp
A fast, portable, simple, and free C/C++ IDE. Contribute to Embarcadero/Dev-Cpp development by creating an account on GitHub.
- 211A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
https://github.com/cutelyst/cutelyst
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework. - cutelyst/cutelyst
- 212a small protobuf implementation in C
https://github.com/protocolbuffers/upb
a small protobuf implementation in C. Contribute to protocolbuffers/upb development by creating an account on GitHub.
- 213The Evil License Manager
https://github.com/avati/libevil
The Evil License Manager. Contribute to avati/libevil development by creating an account on GitHub.
- 214Cista is a simple, high-performance, zero-copy C++ serialization & reflection library.
https://github.com/felixguendling/cista
Cista is a simple, high-performance, zero-copy C++ serialization & reflection library. - felixguendling/cista
- 215Your binary serialization library
https://github.com/fraillt/bitsery
Your binary serialization library. Contribute to fraillt/bitsery development by creating an account on GitHub.
- 216Boost.org property_tree module
https://github.com/boostorg/property_tree
Boost.org property_tree module. Contribute to boostorg/property_tree development by creating an account on GitHub.
- 217Automatically exported from code.google.com/p/vartypes
https://github.com/szi/vartypes
Automatically exported from code.google.com/p/vartypes - szi/vartypes
- 218VerbalExpressions/QtVerbalExpressions
https://github.com/VerbalExpressions/QtVerbalExpressions
Contribute to VerbalExpressions/QtVerbalExpressions development by creating an account on GitHub.
- 219collection of C/C++ programs that try to get compilers to exploit undefined behavior
https://github.com/regehr/ub-canaries
collection of C/C++ programs that try to get compilers to exploit undefined behavior - regehr/ub-canaries
- 220MessagePack implementation for C and C++ / msgpack.org[C/C++]
https://github.com/msgpack/msgpack-c
MessagePack implementation for C and C++ / msgpack.org[C/C++] - msgpack/msgpack-c
- 221:fish_cake: A new take on polymorphism
https://github.com/iboB/dynamix
:fish_cake: A new take on polymorphism. Contribute to iboB/dynamix development by creating an account on GitHub.
- 222Cap'n Proto serialization/RPC system - core tools and C++ library
https://github.com/capnproto/capnproto
Cap'n Proto serialization/RPC system - core tools and C++ library - capnproto/capnproto
- 223A C/C++ header to help move #ifdefs out of your code
https://github.com/nemequ/hedley
A C/C++ header to help move #ifdefs out of your code - nemequ/hedley
- 224A Small C Compiler
https://github.com/rui314/8cc
A Small C Compiler. Contribute to rui314/8cc development by creating an account on GitHub.
- 225Apache Xalan C
https://github.com/apache/xalan-c
Apache Xalan C. Contribute to apache/xalan-c development by creating an account on GitHub.
- 226C++ Cheat Sheets & Infographics
https://hackingcpp.com/cpp/cheat_sheets.html
Graphics and cheat sheets, each capturing one aspect of C++: algorithms/containers/STL, language basics, libraries, best practices, terminology (信息图表和备忘录).
- 227A client/server indexer for c/c++/objc[++] with integration for Emacs based on clang.
https://github.com/Andersbakken/rtags
A client/server indexer for c/c++/objc[++] with integration for Emacs based on clang. - Andersbakken/rtags
- 228Pattern-defeating quicksort.
https://github.com/orlp/pdqsort
Pattern-defeating quicksort. Contribute to orlp/pdqsort development by creating an account on GitHub.
- 229Formatted C++20 stdlib man pages (cppreference)
https://github.com/jeaye/stdman
Formatted C++20 stdlib man pages (cppreference). Contribute to jeaye/stdman development by creating an account on GitHub.
- 230Online editor and compiler
https://paiza.io/en
Paiza.IO is online editor and compiler. Java, Ruby, Python, PHP, Perl, Swift, JavaScript... You can use for learning programming, scraping web sites, or writing batch
- 231Xcode - Apple Developer
https://developer.apple.com/xcode/
Xcode includes everything you need to develop, test, and distribute apps across all Apple platforms.
- 232Vireo is a lightweight and versatile video processing library written in C++11
https://github.com/twitter/vireo/
Vireo is a lightweight and versatile video processing library written in C++11 - twitter/vireo
- 233Easy to use and fast C++ CRC library.
https://github.com/d-bahr/CRCpp
Easy to use and fast C++ CRC library. Contribute to d-bahr/CRCpp development by creating an account on GitHub.
- 234CCTZ is a C++ library for translating between absolute and civil times using the rules of a time zone.
https://github.com/google/cctz
CCTZ is a C++ library for translating between absolute and civil times using the rules of a time zone. - google/cctz
- 235Rapid fuzzy string matching in C++ using the Levenshtein Distance
https://github.com/rapidfuzz/rapidfuzz-cpp
Rapid fuzzy string matching in C++ using the Levenshtein Distance - rapidfuzz/rapidfuzz-cpp
- 236Boost.org signals2 module
https://github.com/boostorg/signals2
Boost.org signals2 module. Contribute to boostorg/signals2 development by creating an account on GitHub.
- 237Mobile robot simulator
https://github.com/rtv/Stage
Mobile robot simulator. Contribute to rtv/Stage development by creating an account on GitHub.
- 238Visual Studio Code - Code Editing. Redefined
https://code.visualstudio.com
Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications. Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.
- 239scanf for modern C++
https://github.com/eliaskosunen/scnlib
scanf for modern C++. Contribute to eliaskosunen/scnlib development by creating an account on GitHub.
- 240A date and time library based on the C++11/14/17 <chrono> header
https://github.com/HowardHinnant/date
A date and time library based on the C++11/14/17 <chrono> header - HowardHinnant/date
- 241universal serialization engine
https://github.com/qicosmos/iguana
universal serialization engine. Contribute to qicosmos/iguana development by creating an account on GitHub.
- 242Sorting algorithms & related tools for C++14
https://github.com/Morwenn/cpp-sort
Sorting algorithms & related tools for C++14. Contribute to Morwenn/cpp-sort development by creating an account on GitHub.
- 243The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to and interact with services.
https://github.com/Microsoft/cpprestsdk
The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to an...
- 244Compile and execute C "scripts" in one go!
https://github.com/ryanmjacobs/c
Compile and execute C "scripts" in one go! Contribute to ryanmjacobs/c development by creating an account on GitHub.
- 245TreeFrog Framework : High-speed C++ MVC Framework for Web Application
https://github.com/treefrogframework/treefrog-framework
TreeFrog Framework : High-speed C++ MVC Framework for Web Application - treefrogframework/treefrog-framework
- 246A simple C++ header-only template library implementing matching using wildcards
https://github.com/zemasoft/wildcards/
A simple C++ header-only template library implementing matching using wildcards - zemasoft/wildcards
- 247A modern formatting library
https://github.com/fmtlib/fmt
A modern formatting library. Contribute to fmtlib/fmt development by creating an account on GitHub.
- 248An open-source SDK for PSP homebrew development.
https://github.com/pspdev/pspsdk
An open-source SDK for PSP homebrew development. Contribute to pspdev/pspsdk development by creating an account on GitHub.
- 249Protocol Buffers with small code size
https://github.com/nanopb/nanopb
Protocol Buffers with small code size. Contribute to nanopb/nanopb development by creating an account on GitHub.
- 250A C/C++ minor mode for Emacs powered by libclang
https://github.com/Sarcasm/irony-mode
A C/C++ minor mode for Emacs powered by libclang. Contribute to Sarcasm/irony-mode development by creating an account on GitHub.
- 251Serial Port Programming in C++
https://github.com/crayzeewulf/libserial
Serial Port Programming in C++. Contribute to crayzeewulf/libserial development by creating an account on GitHub.
- 252Production-ready C++ Asynchronous Framework with rich functionality
https://github.com/userver-framework/userver
Production-ready C++ Asynchronous Framework with rich functionality - userver-framework/userver
- 253A Fast and Easy to use microframework for the web.
https://github.com/CrowCpp/Crow
A Fast and Easy to use microframework for the web. - CrowCpp/Crow
- 254A standalone and lightweight C library
https://github.com/attractivechaos/klib
A standalone and lightweight C library. Contribute to attractivechaos/klib development by creating an account on GitHub.
- 255Functional programming style pattern-matching library for C++
https://github.com/solodon4/Mach7
Functional programming style pattern-matching library for C++ - solodon4/Mach7
- 256Embedded C/C++ web server
https://github.com/civetweb/civetweb
Embedded C/C++ web server. Contribute to civetweb/civetweb development by creating an account on GitHub.
- 257Telegram Bot C++ Library
https://github.com/baderouaich/tgbotxx
Telegram Bot C++ Library. Contribute to baderouaich/tgbotxx development by creating an account on GitHub.
- 258Your high performance web application C framework
https://github.com/boazsegev/facil.io
Your high performance web application C framework. Contribute to boazsegev/facil.io development by creating an account on GitHub.
- 259🌱Light and powerful C++ web framework for highly scalable and resource-efficient web application. It's zero-dependency and easy-portable.
https://github.com/oatpp/oatpp
🌱Light and powerful C++ web framework for highly scalable and resource-efficient web application. It's zero-dependency and easy-portable. - oatpp/oatpp
- 260Visual Studio Code
https://github.com/microsoft/vscode
Visual Studio Code. Contribute to microsoft/vscode development by creating an account on GitHub.
- 261The password hash Argon2, winner of PHC
https://github.com/P-H-C/phc-winner-argon2
The password hash Argon2, winner of PHC . Contribute to P-H-C/phc-winner-argon2 development by creating an account on GitHub.
- 262Header-only C++11 library to encode/decode base64, base64url, base32, base32hex and hex (a.k.a. base16) as specified in RFC 4648, plus Crockford's base32. MIT licensed with consistent, flexible API.
https://github.com/tplgy/cppcodec
Header-only C++11 library to encode/decode base64, base64url, base32, base32hex and hex (a.k.a. base16) as specified in RFC 4648, plus Crockford's base32. MIT licensed with consistent, flexible...
- 263Pretty Printer for Modern C++
https://github.com/p-ranav/pprint
Pretty Printer for Modern C++. Contribute to p-ranav/pprint development by creating an account on GitHub.
- 264Tiny XML library.
https://github.com/michaelrsweet/mxml
Tiny XML library. Contribute to michaelrsweet/mxml development by creating an account on GitHub.
- 265stb single-file public domain libraries for C/C++
https://github.com/nothings/stb
stb single-file public domain libraries for C/C++. Contribute to nothings/stb development by creating an account on GitHub.
- 266A Template Engine for Modern C++
https://github.com/pantor/inja
A Template Engine for Modern C++. Contribute to pantor/inja development by creating an account on GitHub.
- 267A cross-platform Qt IDE
https://github.com/qt-creator/qt-creator
A cross-platform Qt IDE. Contribute to qt-creator/qt-creator development by creating an account on GitHub.
- 268CSerialPort - lightweight cross-platform serial port library for C++/C/C#/Java/Python/Node.js/Electron
https://github.com/itas109/CSerialPort
CSerialPort - lightweight cross-platform serial port library for C++/C/C#/Java/Python/Node.js/Electron - GitHub - itas109/CSerialPort: CSerialPort - lightweight cross-platform serial port library ...
- 269:zap: The Mobile Robot Programming Toolkit (MRPT)
https://github.com/mrpt/mrpt/
:zap: The Mobile Robot Programming Toolkit (MRPT). Contribute to MRPT/mrpt development by creating an account on GitHub.
- 270Open h.265 video codec implementation.
https://github.com/strukturag/libde265
Open h.265 video codec implementation. Contribute to strukturag/libde265 development by creating an account on GitHub.
- 271🦘 A dependency injection container for C++11, C++14 and later
https://github.com/gracicot/kangaru
🦘 A dependency injection container for C++11, C++14 and later - gracicot/kangaru
- 272Bear is a tool that generates a compilation database for clang tooling.
https://github.com/rizsotto/Bear
Bear is a tool that generates a compilation database for clang tooling. - rizsotto/Bear
- 273ita1024 / waf · GitLab
https://gitlab.com/ita1024/waf
The Waf build system
- 274MicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems
https://github.com/micropython/micropython
MicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems - micropython/micropython
- 275Protocol Buffers - Google's data interchange format
https://github.com/protocolbuffers/protobuf
Protocol Buffers - Google's data interchange format - protocolbuffers/protobuf
- 276C++ Discord API Bot Library - D++ is Lightweight and scalable for small and huge bots!
https://github.com/brainboxdotcc/DPP
C++ Discord API Bot Library - D++ is Lightweight and scalable for small and huge bots! - brainboxdotcc/DPP
- 277cppit / jucipp · GitLab
https://gitlab.com/cppit/jucipp
juCi++: a lightweight, cross-platform IDE
- 278A header only library for creating and validating json web tokens in c++
https://github.com/Thalhammer/jwt-cpp
A header only library for creating and validating json web tokens in c++ - Thalhammer/jwt-cpp
- 279FlatBuffers: Memory Efficient Serialization Library
https://github.com/google/flatbuffers
FlatBuffers: Memory Efficient Serialization Library - google/flatbuffers
- 280Semantic version in ANSI C
https://github.com/h2non/semver.c
Semantic version in ANSI C. Contribute to h2non/semver.c development by creating an account on GitHub.
- 281awesome-cpp/books.md at master · fffaraz/awesome-cpp
https://github.com/fffaraz/awesome-cpp/blob/master/books.md
A curated list of awesome C++ (or C) frameworks, libraries, resources, and shiny things. Inspired by awesome-... stuff. - fffaraz/awesome-cpp
- 282awesome-cpp/videos.md at master · fffaraz/awesome-cpp
https://github.com/fffaraz/awesome-cpp/blob/master/videos.md
A curated list of awesome C++ (or C) frameworks, libraries, resources, and shiny things. Inspired by awesome-... stuff. - fffaraz/awesome-cpp
- 283CppDepend - Boost Your C and C++ Code Quality.
https://www.cppdepend.com/
Improve your C and C++ code quality with CppDepend, the leading static analysis and code quality tool. Try it now and experience cleaner, more maintainable code!
- 284Jinja2 C++ (and for C++) almost full-conformance template engine implementation
https://github.com/jinja2cpp/Jinja2Cpp
Jinja2 C++ (and for C++) almost full-conformance template engine implementation - jinja2cpp/Jinja2Cpp
- 285Quick C++ Benchmarks
https://quick-bench.com/
Quickly benchmark C++ runtimes
- 286A modern C++ library for type-safe environment variable parsing
https://github.com/ph3at/libenvpp
A modern C++ library for type-safe environment variable parsing - ph3at/libenvpp
- 287Spack
https://spack.io/
A flexible package manager supporting multiple versions, configurations, platforms, and compilers.
- 288C++ Build Benchmarks
https://build-bench.com/
Compare build times of C++ code
- 289Simple Dynamic Strings library for C
https://github.com/antirez/sds
Simple Dynamic Strings library for C. Contribute to antirez/sds development by creating an account on GitHub.
- 290A Discord API wrapper library made in C
https://github.com/Cogmasters/concord
A Discord API wrapper library made in C. Contribute to Cogmasters/concord development by creating an account on GitHub.
- 291C++ Web Framework REST API
https://github.com/wfrest/wfrest
C++ Web Framework REST API. Contribute to wfrest/wfrest development by creating an account on GitHub.
- 292High performance C++11 signals
https://github.com/larspensjo/SimpleSignal
High performance C++11 signals. Contribute to larspensjo/SimpleSignal development by creating an account on GitHub.
- 293Implementation of python itertools and builtin iteration functions for C++17
https://github.com/ryanhaining/cppitertools
Implementation of python itertools and builtin iteration functions for C++17 - ryanhaining/cppitertools
- 294static analysis of C/C++ code
https://github.com/danmar/cppcheck
static analysis of C/C++ code. Contribute to danmar/cppcheck development by creating an account on GitHub.
- 295Anjuta DevStudio
https://sourceforge.net/projects/anjuta/
Download Anjuta DevStudio for free. Anjuta DevStudio is a versatile Integrated Development Environment (IDE) for software development on GNU/Linux. It features many advanced facilities such as project management, application wizards, interactive debugger, source browsing etc.
- 296Online C++ Compiler - Programiz
https://www.programiz.com/cpp-programming/online-compiler
Write and run your C++ code using our online compiler. Enjoy additional features like code sharing, dark mode, and support for multiple programming languages.
- 297libonion - Coralbits S.L.
http://www.coralbits.com/libonion/
Lightweight C library to add web server functionality to your program libonion is a lightweight library to help you create webservers in C programming language. These webservers may be a web application, a means of expanding your own application to give it web functionality or even a fully featured webserver. The user can create new […]
- 298Learn C++ - Best C++ Tutorials | Hackr.io
https://hackr.io/tutorials/learn-c-plus-plus
Learning C++? Check out these best online C++ courses and tutorials recommended by the programming community. Pick the tutorial as per your learning style: video tutorials or a book. Free course or paid. Tutorials for beginners or advanced learners. Check C++ community's reviews & comments.
- 299C++ Team Blog
https://devblogs.microsoft.com/cppblog/
C++ tutorials, C and C++ news, and information about Visual Studio, Visual Studio Code, and Vcpkg from the Microsoft C++ team.
- 300Rapid YAML - a library to parse and emit YAML, and do it fast.
https://github.com/biojppm/rapidyaml
Rapid YAML - a library to parse and emit YAML, and do it fast. - biojppm/rapidyaml
- 301CppExpert | The best way to Learn C++ for free
https://cppexpert.online
CppExpert is the best free platform to learn C++. Learn the best practices of C++ programming with CppExpert.
- 302Smart Swift/Objective-C IDE for iOS & macOS Development
http://www.jetbrains.com/objc/
An intelligent IDE for iOS/macOS development focused on code quality, efficient code navigation, smart code completion, on-the-fly code analysis with quick-fixes and superior code refactorings.
- 303A Cross-Platform IDE for C and C++ by JetBrains
http://www.jetbrains.com/clion/
A powerful IDE from JetBrains helps you develop in C and C++ on Linux, macOS and Windows.
- 304.NET programming with C++/CLI
https://docs.microsoft.com/en-us/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=msvc-160
Learn how to use C++/CLI to create .NET apps and components in Visual Studio.
- 305Home · Wiki · GNOME / libxml2 · GitLab
http://xmlsoft.org/
XML parser and toolkit
- 306C++ quiz
https://quiz.pvs-studio.com
Test yourself. See if you can find all the bugs in the code.
- 307C++11/14/17/20 library for lazy evaluation
https://github.com/MarcDirven/cpp-lazy
C++11/14/17/20 library for lazy evaluation. Contribute to MarcDirven/cpp-lazy development by creating an account on GitHub.
- 308Ideone.com
http://ideone.com/
Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.
- 309GotW
https://herbsutter.com/gotw/
Guru of the Week (GotW) is a series of C++ programming problems created and written by Herb Sutter. Starting in May 2013, GotW articles are currently being revised to match the upcoming C++14 ISO S…
- 310Dev-C++
http://sourceforge.net/projects/orwelldevcpp/
Download Dev-C++ for free. A free, portable, fast and simple C/C++ IDE. A new and improved fork of Bloodshed Dev-C++
- 311Mastering MISRA C++ Compliance with CppDepend.
https://www.cppdepend.com/misra-cpp
Discover the role of MISRA C++ in the automotive industry, a collaborative effort between vehicle manufacturers, component suppliers, and engineering consultancies to establish best practices for safety-related electronic systems in road vehicles and other embedded systems. Learn how CppDepend supports MISRA C++ compliance to achieve safer and more reliable software.
- 312Online Courses - Learn Anything, On Your Schedule | Udemy
https://www.udemy.com/topic/C-plus-plus-tutorials/
Udemy is an online learning and teaching marketplace with over 250,000 courses and 73 million students. Learn programming, marketing, data science and more.
- 313boostcon/cppnow_presentations_2022
https://github.com/boostcon/cppnow_presentations_2022
Contribute to boostcon/cppnow_presentations_2022 development by creating an account on GitHub.
- 314IDE and Code Editor for Software Developers and Teams
https://www.visualstudio.com/
Visual Studio dev tools & services make app development easy for any developer, on any platform & language. Develop with our code editor or IDE anywhere for free.
- 315C++ Tutorial | Learn C++ Programming Language - Scaler Topics
https://www.scaler.com/topics/cpp
This C++ tutorial on Scaler Topics will teach you all concepts in C++, from the fundamentals to the advanced concepts. Beginners and even professionals can easily follow this C++ tutorial.
- 316Repository for the slides and the code of my "Quick game development with C++11/C++14" CppCon 2014 talk.
https://github.com/SuperV1234/cppcon2014
Repository for the slides and the code of my "Quick game development with C++11/C++14" CppCon 2014 talk. - vittorioromeo/cppcon2014
- 317C/C++ language server supporting multi-million line code base, powered by libclang. Emacs, Vim, VSCode, and others with language server protocol support. Cross references, completion, diagnostics, semantic highlighting and more
https://github.com/cquery-project/cquery/
C/C++ language server supporting multi-million line code base, powered by libclang. Emacs, Vim, VSCode, and others with language server protocol support. Cross references, completion, diagnostics, ...
- 318Intel® oneAPI DPC++/C++ Compiler
https://software.intel.com/en-us/c-compilers
Compile for CPUs, GPUs, and FPGAs with an LLVM technology-based compiler that enables custom accelerator tuning and supports OpenMP for GPU offload.
- 319Replit – Build software faster
https://repl.it
Replit is an AI-powered software development & deployment platform for building, sharing, and shipping software fast.
- 320Presentation on Hana for C++Now 2015
https://github.com/ldionne/hana-cppnow-2015
Presentation on Hana for C++Now 2015. Contribute to ldionne/cppnow-2015-hana development by creating an account on GitHub.
- 321Eclipse CDT™ (C/C++ Development Tooling)
http://www.eclipse.org/cdt/
Eclipse CDT™ (C/C++ Development Tooling) has 7 repositories available. Follow their code on GitHub.
- 322Collaborative Collection of C++ Best Practices. This online resource is part of Jason Turner's collection of C++ Best Practices resources. See README.md for more information.
https://github.com/lefticus/cppbestpractices
Collaborative Collection of C++ Best Practices. This online resource is part of Jason Turner's collection of C++ Best Practices resources. See README.md for more information. - cpp-best-practic...
- 323ruslo/hunter
https://www.github.com/ruslo/hunter
Contribute to ruslo/hunter development by creating an account on GitHub.
- 324This project is obsolete. TinyXML-2 offers a very similar C++ interface.
https://github.com/rjpcomputing/ticpp
This project is obsolete. TinyXML-2 offers a very similar C++ interface. - wxFormBuilder/ticpp
- 325Suite of C++ libraries for radio astronomy data processing
https://code.google.com/p/casacore/
Suite of C++ libraries for radio astronomy data processing - casacore/casacore
- 326A C++ implementation of timsort
https://github.com/gfx/cpp-TimSort
A C++ implementation of timsort. Contribute to timsort/cpp-TimSort development by creating an account on GitHub.
- 327Drogon: A C++14/17/20 based HTTP web application framework running on Linux/macOS/Unix/Windows
https://github.com/an-tao/drogon
Drogon: A C++14/17/20 based HTTP web application framework running on Linux/macOS/Unix/Windows - drogonframework/drogon
- 328Cross-platform C++11 header-only library for memory mapped file IO
https://github.com/mandreyel/mio
Cross-platform C++11 header-only library for memory mapped file IO - vimpunk/mio
Related Articlesto learn about angular.
- 1Introduction to C++: Beginner's Guide to Getting Started
- 2C++ Variables, Data Types, and Operators
- 3Control Flow in C++: Conditionals and Loops
- 4C++ Object-Oriented Programming: Classes and Objects
- 5Templates and Generic Programming in C++: Comprehensive Guide
- 6C++ Memory Management: Pointers and Dynamic Allocation
- 7Building Your First C++ Application: Step-by-Step Guide
- 8C++ in Game Development: How to Get Started with Simple Games
- 9Best Practices for Writing Efficient and Maintainable C++ Code
- 10Advanced C++ Optimization: Performance in Critical Areas
FAQ'sto learn more about Angular JS.
mail [email protected] to add more queries here 🔍.
- 1
how long does it take to learn c++ programming
- 2
what c++ programming language
- 3
where to practice c++ programming
- 4
should i learn c++ or python
- 5
why was c++ invented
- 6
what are variables in c++ programming
- 7
which app is used for c++ programming
- 8
how to do c programming in turbo c++
- 9
what does mean in c++ programming
- 10
where c++ programming is used
- 11
how to learn c++ programming for beginners
- 13
is c++ programming language still used
- 14
why c++ is best for competitive programming
- 15
why was c++ developed
- 16
when is c++ used more often
- 17
what is c++ programming language definition
- 18
how to use dev c++ for c programming
- 19
why c++ procedural programming
- 20
what are strings in c++ programming
- 21
what is generic programming in c++
- 22
who developed c++ programming language
- 23
what does a c++ programmer do
- 24
where to learn c++ programming
- 25
where to learn c++ for competitive programming
- 26
when is c++ used
- 27
how to learn c++ programming language
- 28
why we use c++ programming language
- 29
who created c++ programming language
- 30
what can you do with c++ programming
- 31
how to do c++ programming in ubuntu
- 32
what are advantages of java programming over c++
- 33
what programming language is c++ written in
- 34
what c++ programming is used for
- 35
should i learn c++ or java first
- 36
how to practice c++ programming
- 37
how to use turbo c++ for c programming
- 38
should i learn c++ or python first
- 39
which app is best for c++ programming
- 40
how to learn c++ programming
- 41
can c++ run on mac
- 42
when was c++ programming language invented
- 43
does c++ support functional programming
- 44
is c++ a programming language
- 45
should i learn c++ as a beginner
- 46
what can i do with c++ programming language
- 47
what is an array in programming c++
- 48
why does c++ fail in web programming
- 49
can c and c++ be mixed
- 50
will c++ become obsolete
- 51
does c++ have a future
- 52
can c++ run on linux
- 53
how to do c++ programming in android phone
- 54
what are the function in c++ programming
- 55
should i learn c++ as my first language
- 56
where to download c++ programming language
- 57
what are the features of object oriented programming in c++
- 58
was c++ written in c
- 59
how to start c++ programming language
- 60
how can i learn c++ programming language
- 61
why c++ is the best programming language
- 62
what are the uses of c++ programming language
- 63
why is c++ used in competitive programming
- 64
can c++ call python
- 65
how to use c++ programming language
- 66
will c++ ever die
- 67
does c++ cost money
- 68
when c++ is mostly used
- 69
is c++ programming hard
- 70
who invented c++ programming language
- 71
which software is used for c++ programming
- 72
where to do c++ programming
- 73
how do i learn c++ programming language
- 74
how to make a programming language in c++
- 75
can c++ run c code
- 76
why is c++ called object oriented programming
- 77
how do you pronounce c++ programming language
- 78
what is c++ programming language in hindi
- 79
why is c++ object oriented programming
- 80
who updates c++
- 81
what is c++ programming with example
- 82
what are the characteristics of c++ programming language
- 83
what is introduction to c++ programming
- 84
what can you do with c++ programming language
- 85
why learn c++ programming
- 86
which programming language should i learn after c++
- 87
who uses c++ programming language
- 88
how to do c++ programming in windows 10
- 89
what is c++ programming language used for
- 90
what are the data types in c++ programming
- 91
how did c++ get its name
- 92
what is c++ in computer programming
- 93
who created c++
- 94
what is procedure oriented programming in c++
- 95
how to start learning c++ programming
- 96
what is c++ programming used for
- 97
is c++ programming language
- 98
is c++ good for software development
- 99
is c++ powerful
- 100
what is basic c++ program
- 101
what is c++ in coding
- 102
what is c++ programming pdf
- 103
which software is best for c++ programming
- 104
what is c++ programming
- 105
why is c++ important in programming
- 106
what are structures in c++ programming
- 107
when did c++ come out
- 108
what is object oriented programming in c++
- 109
when was c++ invented
- 110
when was c++ programming language created
- 111
why study c++ programming
- 112
will c++ be replaced
- 113
does c code work in c++
More Sitesto check out once you're finished browsing here.
https://www.0x3d.site/
0x3d is designed for aggregating information.
https://nodejs.0x3d.site/
NodeJS Online Directory
https://cross-platform.0x3d.site/
Cross Platform Online Directory
https://open-source.0x3d.site/
Open Source Online Directory
https://analytics.0x3d.site/
Analytics Online Directory
https://javascript.0x3d.site/
JavaScript Online Directory
https://golang.0x3d.site/
GoLang Online Directory
https://python.0x3d.site/
Python Online Directory
https://swift.0x3d.site/
Swift Online Directory
https://rust.0x3d.site/
Rust Online Directory
https://scala.0x3d.site/
Scala Online Directory
https://ruby.0x3d.site/
Ruby Online Directory
https://clojure.0x3d.site/
Clojure Online Directory
https://elixir.0x3d.site/
Elixir Online Directory
https://elm.0x3d.site/
Elm Online Directory
https://lua.0x3d.site/
Lua Online Directory
https://c-programming.0x3d.site/
C Programming Online Directory
https://cpp-programming.0x3d.site/
C++ Programming Online Directory
https://r-programming.0x3d.site/
R Programming Online Directory
https://perl.0x3d.site/
Perl Online Directory
https://java.0x3d.site/
Java Online Directory
https://kotlin.0x3d.site/
Kotlin Online Directory
https://php.0x3d.site/
PHP Online Directory
https://react.0x3d.site/
React JS Online Directory
https://angular.0x3d.site/
Angular JS Online Directory