## C++ support ## Mbed OS supports a number of toolchains, and the files here provide support to smooth over C++ library differences. The current baseline version is C++14, so we hope for full C++14 library support. Omissions are: * areas like chrono and threads, which depend on OS support, where retargeting is not complete. * atomics and shared pointers, as atomic implementations for ARMv6-M are not provided by all toolchains, and the ARMv7-M implementations include DMB instructions we do not want/need for non-SMP. User code should normally be able to include C++14 headers and get most expected functionality. (But bear in mind that many C++ library features like streams and STL containers are quite heavy and may not be appropriate for small embnedded use). However, ARM C 5 has only C++11 language support (at least a large subset), and no C++11/14 library. For the headers that are totally new in C++11, they are provided here in TOOLCHAIN_ARMC5 under their standard C++11 name. (Eg ``, ``, ``, ``). But for headers that already exist in C++03, extensions are required. So, to support ARM C 5, use `#include `, rather than `#include ` if you need C++11 or later features from that header. Each `mstd_` file includes the toolchain's corresponding header file, which will provide its facilities in `namespace std`. Any missing C++11/C++14 facilities for ARM C 5 are also provided in `namespace std`. Then APIs from `namespace std` are added to `namespace mstd`, with adjustment if necessary, and APIs being omitted if not suitable for embedded use. For example: * `std::size_t` (``) - toolchain's `std::size_t` * `mstd::size_t` (``) - alias for `std::size_t` * `std::swap` (``) - toolchain's `std::swap` (not move-capable for ARM C 5) * `mstd::swap` (``) - alias for `std::swap` or move-capable ARM C 5 replacement. * `std::atomic` (``) - toolchain's `std::atomic` (not implemented for IAR ARMv6) * `mstd::atomic` (``) - custom `mstd::atomic` for all toolchains * `std::void_t` (``) - toolchain's `std::void_t` if available (it's C++17 so likely not) * `mstd::void_t` (``) - alias for `std::void_t` if available, else local implementation * `std::thread` (``) - toolchain's `std::thread` - not available or ported * `mstd::thread` - doesn't exist - `mstd` APIs only exist if available on all toolchains Using `std::xxx` will generally work, but may suffer from toolchain variance. `mstd::xxx` should always be better - it will either be an alias to `std::xxx`, or work better for Mbed OS. In portable code, when compiling for non-Mbed OS, the directive `namespace mstd == std` can be used to cover the difference: ```C++ // my_code.c #if TARGET_LIKE_MBED #include #else #include namespace mstd = std; #endif mstd::atomic my_atomic; ```