A freestanding implementation of C++ is an implementation that can potentially have all of the features, but not the library or tools to support development in it.
Historically, the following headers are available:
#include <cstddef> #include <limits> #include <new> #include <typeinfo> #include <exception> #include <cstdarg> #include <cstdlib> // See note
<cstdlib> is in this context only required to implement
std::at_quick_exit. I would advise not to rely on them depending on the platform you are programming for since they may not work properly if you also were to supply a linker script for example.
In C++11, the support for the following headers was added:
#include <cfloat> #include <climits> #include <cstdint> #include <initializer_list> #include <type_traits> #include <atomic> #include <ciso646> // removed in C++20 #include <cstdalign> // removed in C++20 #include <cstdbool> // removed in C++20
In C++20 were finally added:
#include <version> #include <source_location> #include <compare> #include <coroutine> #include <concepts> #include <bit>
Please take note that while
operator new() may be declared, it is not necessarily defined.
The opposite of a freestanding implementation of C++ is a hosted implementation. A hosted implementation is relying on an operating system to provide a filesystem, inter-process communication and resource management; on the opposite, a freestanding implementation must provide all of the tools to create those, potentially depending on some externally written assembly code parts to handle specific features.