5.0.0
版本发布时间: 2018-05-22 21:08:11
fmtlib/fmt最新发布版本:11.0.2(2024-07-20 22:32:04)
-
Added a requirement for partial C++11 support, most importantly variadic templates and type traits, and dropped
FMT_VARIADIC_*
emulation macros. Variadic templates are available since GCC 4.4, Clang 2.9 and MSVC 18.0 (2013). For older compilers use {fmt} version 4.x which continues to be maintained and works with C++98 compilers. -
Renamed symbols to follow standard C++ naming conventions and proposed a subset of the library for standardization in P0645R2 Text Formatting.
-
Implemented
constexpr
parsing of format strings and compile-time format string checks. For example#include <fmt/format.h> std::string s = format(fmt("{:d}"), "foo");
gives a compile-time error because
d
is an invalid specifier for strings (godbolt):... <source>:4:19: note: in instantiation of function template specialization 'fmt::v5::format<S, char [4]>' requested here std::string s = format(fmt("{:d}"), "foo"); ^ format.h:1337:13: note: non-constexpr function 'on_error' cannot be used in a constant expression handler.on_error("invalid type specifier");
Compile-time checks require relaxed
constexpr
(C++14 feature) support. If the latter is not available, checks will be performed at runtime. -
Separated format string parsing and formatting in the extension API to enable compile-time format string processing. For example
struct Answer {}; namespace fmt { template <> struct formatter<Answer> { constexpr auto parse(parse_context& ctx) { auto it = ctx.begin(); spec = *it; if (spec != 'd' && spec != 's') throw format_error("invalid specifier"); return ++it; } template <typename FormatContext> auto format(Answer, FormatContext& ctx) { return spec == 's' ? format_to(ctx.begin(), "{}", "fourty-two") : format_to(ctx.begin(), "{}", 42); } char spec = 0; }; } std::string s = format(fmt("{:x}"), Answer());
gives a compile-time error due to invalid format specifier (godbolt):
... <source>:12:45: error: expression '<throw-expression>' is not a constant expression throw format_error("invalid specifier");
-
Added iterator support:
#include <vector> #include <fmt/format.h> std::vector<char> out; fmt::format_to(std::back_inserter(out), "{}", 42);
-
Added the format_to_n function that restricts the output to the specified number of characters (#298):
char out[4]; fmt::format_to_n(out, sizeof(out), "{}", 12345); // out == "1234" (without terminating '\0')
-
Added the formatted_size function for computing the output size:
#include <fmt/format.h> auto size = fmt::formatted_size("{}", 12345); // size == 5
-
Improved compile times by reducing dependencies on standard headers and providing a lightweight core API:
#include <fmt/core.h> fmt::print("The answer is {}.", 42);
-
Added the make_format_args function for capturing formatting arguments:
// Prints formatted error message. void vreport_error(const char *format, fmt::format_args args) { fmt::print("Error: "); fmt::vprint(format, args); } template <typename... Args> void report_error(const char *format, const Args & ... args) { vreport_error(format, fmt::make_format_args(args...)); }
-
Added the
make_printf_args
function for capturingprintf
arguments ( #687, #694). Thanks @Kronuz (Germán Méndez Bravo). -
Added prefix
v
to non-variadic functions takingformat_args
to distinguish them from variadic ones:std::string vformat(string_view format_str, format_args args); template <typename... Args> std::string format(string_view format_str, const Args & ... args);
-
Added experimental support for formatting ranges, containers and tuple-like types in
fmt/ranges.h
(#735):#include <fmt/ranges.h> std::vector<int> v = {1, 2, 3}; fmt::print("{}", v); // prints {1, 2, 3}
Thanks @Remotion (Remo).
-
Implemented
wchar_t
date and time formatting (#712):#include <fmt/time.h> std::time_t t = std::time(nullptr); auto s = fmt::format(L"The date is {:%Y-%m-%d}.", *std::localtime(&t));
Thanks @DanielaE (Daniela Engert).
-
Provided more wide string overloads (#724). Thanks @DanielaE (Daniela Engert).
-
Switched from a custom null-terminated string view class to
string_view
in the format API and providedfmt::string_view
which implements a subset ofstd::string_view
API for pre-C++17 systems. -
Added support for
std::experimental::string_view
(#607):#include <fmt/core.h> #include <experimental/string_view> fmt::print("{}", std::experimental::string_view("foo"));
-
Allowed mixing named and automatic arguments:
fmt::format("{} {two}", 1, fmt::arg("two", 2));
-
Removed the write API in favor of the format API with compile-time handling of format strings.
-
Disallowed formatting of multibyte strings into a wide character target (#606).
-
Improved documentation ( #515, #614, #617, #661, #680). Thanks @ibell (Ian Bell), @mihaitodor (Mihai Todor), and @johnthagen.
-
Implemented more efficient handling of large number of format arguments.
-
Introduced an inline namespace for symbol versioning.
-
Added debug postfix
d
to thefmt
library name (#636). -
Removed unnecessary
fmt/
prefix in includes (#397). Thanks @chronoxor (Ivan Shynkarenka). -
Moved
fmt/*.h
toinclude/fmt/*.h
to prevent irrelevant files and directories appearing on the include search paths when fmt is used as a subproject and moved source files to thesrc
directory. -
Added qmake project file
support/fmt.pro
(#641). Thanks @cowo78 (Giuseppe Corbelli). -
Added Gradle build file
support/build.gradle
(#649). Thanks @luncliff (Park DongHa). -
Removed
FMT_CPPFORMAT
CMake option. -
Fixed a name conflict with the macro
CHAR_WIDTH
in glibc (#616). Thanks @aroig (Abdó Roig-Maranges). -
Fixed handling of nested braces in
fmt::join
(#638). -
Added
SOURCELINK_SUFFIX
for compatibility with Sphinx 1.5 (#497). Thanks @ginggs (Graham Inggs). -
Added a missing
inline
in the header-only mode (#626). Thanks @aroig (Abdó Roig-Maranges). -
Fixed various compiler warnings ( #640, #656, #679, #681, #705, #715, #717, #720, #723, #726, #730, #739). Thanks @peterbell10, @LarsGullik, @foonathan (Jonathan Müller), @eliaskosunen (Elias Kosunen), @christianparpart (Christian Parpart), @DanielaE (Daniela Engert), and @mwinterb.
-
Worked around an MSVC bug and fixed several warnings (#653). Thanks @alabuzhev (Alex Alabuzhev).
-
Worked around GCC bug 67371 (#682).
-
Fixed compilation with
-fno-exceptions
(#655). Thanks @chenxiaolong (Andrew Gunnerson). -
Made
constexpr remove_prefix
gcc version check tighter (#648). -
Renamed internal type enum constants to prevent collision with poorly written C libraries (#644).
-
Added detection of
wostream operator<<
(#650). -
Fixed compilation on OpenBSD (#660). Thanks @hubslave.
-
Fixed compilation on FreeBSD 12 (#732). Thanks @dankm.
-
Fixed compilation when there is a mismatch between
-std
options between the library and user code (#664). -
Fixed compilation with GCC 7 and
-std=c++11
(#734). -
Improved generated binary code on GCC 7 and older (#668).
-
Fixed handling of numeric alignment with no width (#675).
-
Fixed handling of empty strings in UTF8/16 converters (#676). Thanks @vgalka-sl (Vasili Galka).
-
Fixed formatting of an empty
string_view
(#689). -
Fixed detection of
string_view
on libc++ (#686). -
Fixed DLL issues (#696). Thanks @sebkoenig.
-
Fixed compile checks for mixing narrow and wide strings (#690).
-
Disabled unsafe implicit conversion to
std::string
(#729). -
Fixed handling of reused format specs (as in
fmt::join
) for pointers (#725). Thanks @mwinterb. -
Fixed installation of
fmt/ranges.h
(#738). Thanks @sv1990.
1、 fmt-5.0.0.zip 1001.05KB