Namespaces
Variants
Actions

Freestanding and hosted implementations

From cppreference.com
< cpp

There are two kinds of implementations defined by the C++ standard: hosted and freestanding implementations. For hosted implementations, the set of standard library headers required by the C++ standard is much larger than for freestanding ones. In a freestanding implementation, execution may happen without an operating system.

The kind of the implementation is implementation-defined. The predefined macro __STDC_HOSTED__ is expanded to 1 for hosted implementations and 0 for freestanding implementations.(since C++11)

Contents

Requirements on multi-threaded executions and data races

freestanding hosted
Under a freestanding implementation, it is implementation-defined whether a program can have more than one thread of execution. Under a hosted implementation, a C++ program can have more than one thread running concurrently.
(since C++11)

[edit] Requirements on the main function

freestanding hosted
In a freestanding implementation, it is implementation-defined whether a program is required to define a main function. Start-up and termination is implementation-defined; start-up contains the execution of constructors for objects of namespace scope with static storage duration; termination contains the execution of destructors for objects with static storage duration. In a hosted implementation, a program must contain a global function called main. Executing a program starts a main thread of execution in which the main function is invoked, and in which variables of static storage duration might be initialized and destroyed.

[edit] Requirements on standard library headers

A freestanding implementation has an implementation-defined set of headers. This set includes at least the headers in the following table.

For partially freestanding headers, freestanding implementations only needs to provide part of the entities in the corresponding synopsis:

  • If an entity is commented // freestanding, it is guaranteed to be provided.
  • If an entity (function or function template) is commented // freestanding-deleted, it is guaranteed to be either provided or deleted.
(since C++26)
  • If an entity is declared in a header whose synopsis begins with all freestanding or // mostly freestanding, it is guaranteed to be provided if the entity itself is not commented.

[edit] Headers required for a freestanding implementation

Library Component Headers  Freestanding 
Language support Common definitions <cstddef> All
C standard library <cstdlib> Partial
Implementation properties <cfloat>
<climits> (since C++11)
<limits>
<version> (since C++20)
All
Integer types <cstdint> (since C++11) All
Dynamic memory management <new> All
Type identification <typeinfo> All
Source location <source_location> (since C++20) All
Exception handling <exception> All
Initializer lists <initializer_list> (since C++11) All
Comparisons <compare> (since C++20) All
Coroutines support <coroutine> (since C++20) All
Other runtime support <cstdarg> All
Debugging support <debugging> (since C++26) All
Concepts <concepts> (since C++20) All
Diagnostics Error numbers <cerrno> (since C++26) Partial
System error support <system_error> (since C++26) Partial
Memory management  Memory <memory> (since C++23) Partial
Metaprogramming Type traits <type_traits> (since C++11) All
Compile-time rational arithmetic  <ratio> (since C++23) All
General utilities Utility components <utility> (since C++23) All
Tuples <tuple> (since C++23) All
Function objects <functional> (since C++20) Partial
Primitive numeric conversions <charconv> (since C++26) Partial
Bit manipulation <bit> (since C++20) All
Strings String classes <string> (since C++26) Partial
Null-terminated
sequence utilities
<cstring> (since C++26) Partial
Text processing Null-terminated
sequence utilities
<cwchar> (since C++26) Partial
Iterators <iterator> (since C++23) Partial
Ranges <ranges> (since C++23) Partial
Numerics Mathematical functions
for floating-point types
<cmath> (since C++26) Partial
Random number generation <random> (since C++26) Partial
Concurrency support Atomics <atomic> (since C++11)     All[1]
Execution control <execution> (since C++26) Partial
Deprecated headers <ciso646> (until C++20)
<cstdalign> (since C++11)(until C++20) 
<cstdbool> (since C++11)(until C++20)
All
  1. Support for always lock-free integral atomic types and presence of type aliases std::atomic_signed_lock_free and std::atomic_unsigned_lock_free are implementation-defined in a freestanding implementation.(since C++20)

[edit] Notes

Some compiler vendors may not fully support freestanding implementation. For example, GCC libstdc++ has had implementation and build issues before version 13, while LLVM libcxx and MSVC STL do not support freestanding.

In C++23, many features are made freestanding with partial headers. However, it is still up for discussion in WG21 whether some headers will be made freestanding in the future standards. Regardless, containers like vector, list, deque, and map will never be freestanding due to their dependencies on exceptions and heap.

GCC 13 provides more headers, such as <optional>, <span>, <array>, and