Skip to content

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 15 194 🐛
std::format 20 13 17 None 194
C++ modules 20 None 17 None None
import std; 23 None 18 None None
Static constexpr variables in constexpr functions 23 13 17 None None
Explicit this parameter 23 14 18 None None
MSVC bugs

MSVC still has a poor C++20 conformance. We had to make many workarounds to our codebase to make it compile on this compiler. Usage of such nasty preprocessor macros degrade the readability and maintainability of our code. This is why we've applied those patches to the main library code but not to unit tests and examples. Those still do not compile on MSVC.

Here is a list of the most important MSVC bugs:

Please upvote them so they get a higher fixing priority at Microsoft.

Important

Enabling/disabling features listed above may influence the API of the library and the ABI of the customers' projects.

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:

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 std namespace via import std; instead of the "old-style" header includes.
  • Related build options:

Static constexpr variables in constexpr functions

Explicit this parameter