C++ compiler support (API/ABI)¶
Info
mp-units library tries to provide the best user experience possible with the C++ language. To achieve that, it extensively uses the latest C++ language features.
Even though the library benefits from the latest C++ versions (if available), C++20 is enough to compile and use all of the library's functionality. Newer features can be hidden behind some preprocessor macros providing a backward-compatible way to use them.
The table below provides the minimum compiler version required to compile the code using a specific C++ feature:
| C++ Feature | C++ version | gcc | clang | apple-clang | MSVC |
|---|---|---|---|---|---|
| Minimum support | 20 | 12+ | 16+ && !19 | 15-16 && !17.0 | 19.5+ |
std::format |
20 | 13+ | 17+ | 16+ | 19.5+ |
| C++ modules | 20 | None | 17+ | None | None |
import std; |
23 | 15+ | 18+ | None | 19.5+ |
Explicit this parameter |
23 | 14+ | 18+ | 17+ | 19.5+ |
Clang-19 unfixable bug
Unfortunately, Clang-19 does not build mp-units because of an unfixable bug in the compiler.
Apple Clang-17.0 unfixable bug
Unfortunately, Apple Clang-17.0 (Xcode 16.3, 16.4, 26.0, 26.0.1, 26.1, and 26.2-beta) does not build mp-units because it has the same unfixable bug as Clang-19.
Important
Enabling/disabling features listed above may influence the API of the library and the ABI of the customers' projects.
std::format¶
- Provides powerful text formatting capabilities for C++.
- An alternative fmtlib library can be used instead if
- the C++ language feature is not supported,
- the customer's project did not switch to
std::formatyet (even when the compiler supports it).
- To write code with wide compatibility a dedicated macro may be used.
- Tested with
__cpp_lib_formatfeature test macro. - Related build options:
- Conan: std_format
- CMake: MP_UNITS_API_STD_FORMAT
C++ modules¶
- Provide new way to share declarations and definitions across translation units.
- If used, the library will distribute both "old-style" headers and module interface units
- associated with the same CMake targets.
- Even with full compiler support, a user may still decide to not pay for C++ modules compilation if they are not needed by the customer's project.
- Feature test macro is not used for testing here because even if the compiler does not support the entire C++ feature (e.g. header units), it is enough to build modules for this library.
- Related build options:
- Conan: cxx_modules
- CMake: MP_UNITS_BUILD_CXX_MODULES
Note
More requirements for C++ modules support can be found in the CMake's documentation.
import std;¶
- If enabled, the library will obtain all the definitions from the
stdnamespace viaimport std;instead of the "old-style" header includes. - Related build options:
- Conan: import_std
- CMake: CMAKE_CXX_MODULE_STD
Explicit this parameter¶
- This feature removes the need for the usage of the CRTP idiom in the
quantity_specdefinitions. - To write code with wide compatibility a dedicated macro may be used.
- Tested with
__cpp_explicit_this_parameterfeature test macro.- Note that some compiler versions do not implement this macro even though they do
support the
feature well enough. In such cases, compilation with explicit
thisis enforced.
- Note that some compiler versions do not implement this macro even though they do
support the
feature well enough. In such cases, compilation with explicit
- Related build options:
- Conan: no_crtp
- CMake: MP_UNITS_API_NO_CRTP