github fmtlib/fmt 12.2.0

3 hours ago
  • Added a C11 API that brings fast, type-safe formatting to C. The new fmt-c library and fmt/fmt-c.h header use _Generic to dispatch on argument types and outperform printf/sprintf. For example:

    #include <fmt/fmt-c.h>
    
    fmt_print(stdout, "The answer is {}.\n", 42);

    (#4663, #4671, #4696, #4693, #4694, #4712, #4789). Thanks @soumik15630m, @Ferdi265 and @localspook.

  • Added a separate fmt::fmt-module CMake target for C++20 modules and a CI workflow that exercises module-based builds (#4684, #4685, #4707, #4708, #4702, #4709). Thanks @MathewBensonCode.

  • Enabled the full Dragonbox lookup cache by default for floating-point formatting unless optimizing for binary size (__OPTIMIZE_SIZE__), giving a ~10–25% speedup. Thanks Matthias Kretz for the suggestion. Average time per double on Apple M1 Pro (clang 17, random digits, smaller is better) measured with dtoa-benchmark:

    Method Time (ns)
    fmt (full) 22.07
    fmt (compact) 29.55
    ryu 35.21
    double-conversion 81.81
    sprintf 726.27
    ostringstream 864.34
  • Improved integer formatting performance by ~3% (#4630). Thanks @user202729.

  • Optimized formatting into back-insert iterators by using bulk container append/insert methods (e.g. on std::vector<char> and custom string types) (#4679). Thanks @user202729.

  • Reduced binary size of debug builds (~200k to ~85k in the bloat test) and improved compile speed when consteval is unavailable.

  • Made path formatting lossless, preserving ill-formed UTF-16 sequences when converting std::filesystem::path to a narrow string.

  • Added support for formatting std::unexpected (#4675). Thanks @17steen.

  • Added overloads of fmt::println that take a fmt::text_style (#4782). Thanks @ahoarau.

  • Added support for positional arguments as width and precision specifiers in fmt::printf (#4643). Thanks @KareemOtoum.

  • Made FMT_STRING a no-op when FMT_USE_CONSTEVAL is enabled, since the consteval format-string constructor already provides compile-time validation (#4611, #4612). Thanks @friedkeenan.

  • Promoted fmt::detail::named_arg to the public API as fmt::named_arg and deprecated the detail alias (#4683, #4687). Thanks @TPPPP72.

  • Moved the std::byte formatter from fmt/format.h to fmt/std.h.

  • Provided a default definition for fmt::is_contiguous (#4731, #4770). Thanks @user202729 and @phprus.

  • Added the FMT_USE_FLOCKFILE macro to disable the use of flockfile (#4646, #4666). Thanks @mvastola.

  • Added include_guard(GLOBAL) so that {fmt} can be used in multiple submodules of the same project (#4672). Thanks @torsten48.

  • Improved constexpr support (#4659, #4591). Thanks @elbeno and @17steen.

  • Deprecated the implicit conversion from fmt::format_string and fmt::basic_fstring to string_view to align with std::format_string; use format_string::get() instead.

  • Opted out std::complex from tuple formatting so that the dedicated std::complex formatter is always used.

  • Removed the fmt::say function.

  • Deprecated the std::initializer_list overload of fmt::join and the array overload of fmt::vformat_to.

  • Made the <fmt/core.h> header equivalent to <fmt/base.h> by default. Code that relied on <fmt/core.h> pulling in <fmt/format.h> must now either include <fmt/format.h> directly or define FMT_DEPRECATED_HEAVY_CORE to opt back in.

  • Improved wchar_t support: fmt::join now accepts wchar_t and other non-char separators, and fmt::format_to_n now works with fmt::runtime on wchar_t (#4686, #4714, #4715). Thanks @Yancey2023 and @sunmy2019.

  • Fixed formatting of std::tm with a null tm_zone (#4790). Thanks @Carmel0.

  • Fixed compile-time formatting in fmt/ranges.h, fmt/style.h and fmt/std.h (#4759). Thanks @j4niwzis.

  • Fixed an ambiguity between formatter<std::optional<T>> in fmt/std.h and fmt/ranges.h on C++26 (P3168R2) (#4761). Thanks @phprus.

  • Fixed a GCC PCH breakage triggered by a scoped #pragma GCC optimize.

  • Fixed a TSAN false positive in the locale handling code (#4755).

  • Fixed compile-time format string checks truncating string literals at an embedded null byte (#4732). Thanks @user202729.

  • Fixed out-of-bounds reads in printf formatting (#4741, #4742, #4800). Thanks @Algunenano and @aizu-m.

  • Fixed the return type of the f(un)lockfile wrappers on Windows (#4739). Thanks @mvastola.

  • Worked around a CUDA issue when handling UTF-32 literals (#4719). Thanks @Cazadorro.

  • Fixed missing named-argument validation for compiled format strings (#4638). Thanks @jaeheonshim.

  • Fixed fmt::format_to_n in <fmt/compile.h> failing to compile when <iterator> is not transitively included (#4615).

  • Fixed handling of pointers in format string compilation with FMT_BUILTIN_TYPES=0.

  • Stopped assuming nul termination of the format string in fmt::printf. Thanks @ZUENS2020 for reporting.

  • Fixed a build error when locale support is disabled (#4627). Thanks @marcel-behlau-elfin.

  • Fixed a fallback range formatter for types with a container_type member (#4123, #4660). Thanks @soumik15630m.

  • Fixed C++20 concept detection (#4653). Thanks @tearfur.

  • Fixed a clang compilation failure (#4718). Thanks @mccakit.

  • Fixed various MSVC warnings, including C4305 and conversion warnings on x86 (#4668, #4594). Thanks @kanren3 and @blizzard4591.

  • Updated the Android Gradle Plugin to 9.x (#4651, #4658). Thanks @soumik15630m.

  • Made various code, build and test improvements (#4625, #4639, #4644, #4656, #4680, #4681, #4704, #4710, #4713, #4729, #4751, #4758, #4799). Thanks @ZephyrLykos, @togunchan, @KaganCanSit, @berndpetrovitsch, @Skylion007, @st0rmbtw, @localspook and @EXtremeExploit.

  • Improved documentation, including a rewrite of the format string syntax, better handling of doxygen tags, documenting output_file, fixing CSS so that whitespace is displayed properly, and various smaller fixes (#4622, #4626, #4631, #4667, #4616, #4748). Thanks @heavywatal, @ZephyrLykos, @user202729, @ssszcmawo, @bigmoonbit and @Powerbyte7.

  • Added building of release artifacts and SLSA provenance in CI, added a CodeQL workflow, and added the security policy in .github/SECURITY.md.

Don't miss a new fmt release

NewReleases is sending notifications on new releases.