2.0.0
General
-
[Breaking] Named arguments (#169, #173, #174):
fmt::print("The answer is {answer}.", fmt::arg("answer", 42));
Thanks to @jamboree.
-
[Experimental] User-defined literals for format and named arguments (#204, #206, #207):
using namespace fmt::literals; fmt::print("The answer is {answer}.", "answer"_a=42);
Thanks to @dean0x7d (Dean Moldovan).
-
[Breaking] Formatting of more than 16 arguments is now supported when using variadic templates (#141). Thanks to @Shauren.
-
Runtime width specification (#168):
fmt::format("{0:{1}}", 42, 5); // gives " 42"
Thanks to @jamboree.
-
[Breaking] Enums are now formatted with an overloaded
std::ostream
insertion operator (operator<<
) if available (#232). -
[Breaking] Changed default
bool
format to textual, "true" or "false" (#170):fmt::print("{}", true); // prints "true"
To print
bool
as a number use numeric format specifier such asd
:fmt::print("{:d}", true); // prints "1"
-
fmt::printf
andfmt::sprintf
now support formatting ofbool
with the%s
specifier giving textual output, "true" or "false" (#223):fmt::printf("%s", true); // prints "true"
Thanks to @LarsGullik.
-
[Breaking]
signed char
andunsigned char
are now formatted as integers by default (#217). -
[Breaking] Pointers to C strings can now be formatted with the
p
specifier (#223):fmt::print("{:p}", "test"); // prints pointer value
Thanks to @LarsGullik.
-
[Breaking]
fmt::printf
andfmt::sprintf
now print null pointers as(nil)
and null strings as(null)
for consistency with glibc (#226). Thanks to @LarsGullik. -
[Breaking]
fmt::(s)printf
now supports formatting of objects of user-defined types that provide an overloadedstd::ostream
insertion operator (operator<<
) (#201):fmt::printf("The date is %s", Date(2012, 12, 9));
-
[Breaking] The
Buffer
template is now part of the public API and can be used to implement custom memory buffers (#140). Thanks to @polyvertex (Jean-Charles Lefebvre). -
[Breaking] Improved compatibility between
BasicStringRef
and std::experimental::basic_string_view (#100, #159, #183):- Comparison operators now compare string content, not pointers
BasicStringRef::c_str
replaced byBasicStringRef::data
BasicStringRef
is no longer assumed to be null-terminated
References to null-terminated strings are now represented by a new class,
BasicCStringRef
. -
Dependency on pthreads introduced by Google Test is now optional (#185).
-
New CMake options
FMT_DOC
,FMT_INSTALL
andFMT_TEST
to control generation ofdoc
,install
andtest
targets respectively, on by default (#197, #198, #200). Thanks to @maddinat0r (Alex Martin). -
noexcept
is now used when compiling with MSVC2015 (#215). Thanks to @dmkrepo (Dmitriy). -
Added an option to disable use of
windows.h
whenFMT_USE_WINDOWS_H
is defined as 0 before includingformat.h
(#171). Thanks to @alfps (Alf P. Steinbach). -
[Breaking]
windows.h
is now included withNOMINMAX
unlessFMT_WIN_MINMAX
is defined. This is done to prevent breaking code usingstd::min
andstd::max
and only affects the header-only configuration (#152, #153, #154). Thanks to @DevO2012. -
Improved support for custom character types (#171). Thanks to @alfps (Alf P. Steinbach).
-
Added an option to disable use of IOStreams when
FMT_USE_IOSTREAMS
is defined as 0 before includingformat.h
(#205, #208). Thanks to @JodiTheTigger. -
Improved detection of
isnan
,isinf
andsignbit
.
Optimization
- Made formatting of user-defined types more efficient with a custom stream buffer (#92, #230). Thanks to @NotImplemented.
- Further improved performance of
fmt::Writer
on integer formatting and fixed a minor regression. Now it is ~7% faster thankarma::generate
on Karma's benchmark (#186). - [Breaking] Reduced compiled code size (#143, #149).
Distribution
-
[Breaking] Headers are now installed in
${CMAKE_INSTALL_PREFIX}/include/cppformat
(#178). Thanks to @jackyf (Eugene V. Lyubimkin). -
[Breaking] Changed the library name from
format
tocppformat
for consistency with the project name and to avoid potential conflicts (#178). Thanks to @jackyf (Eugene V. Lyubimkin). -
C++ Format is now available in Debian GNU/Linux (stretch, sid) and derived distributions such as Ubuntu 15.10 and later (#155):
$ sudo apt-get install libcppformat1-dev
Thanks to @jackyf (Eugene V. Lyubimkin).
-
Packages for Fedora and RHEL are now available. Thanks to Dave Johansen.
-
C++ Format can now be installed via Homebrew on OS X (#157):
$ brew install cppformat
Thanks to @ortho, Anatoliy Bulukin.
Documentation
- Migrated from ReadTheDocs to GitHub Pages for better responsiveness and reliability (#128). New documentation address is http://cppformat.github.io/.
- Added Building the documentation section to the documentation.
- Documentation build script is now compatible with Python 3 and newer pip versions. (#189, #209). Thanks to @JodiTheTigger and @xentec.
- Documentation fixes and improvements (#36, #75, #125, #160, #161, #162, #165, #210). Thanks to @syohex (Syohei YOSHIDA) and bug reporters.
- Fixed out-of-tree documentation build (#177). Thanks to @jackyf (Eugene V. Lyubimkin).
Fixes
-
Fixed
initializer_list
detection (#136). Thanks to @Gachapen (Magnus Bjerke Vik). -
[Breaking] Fixed formatting of enums with numeric format specifiers in
fmt::(s)printf
(#131, #139):enum { ANSWER = 42 }; fmt::printf("%d", ANSWER);
Thanks to @Naios.
-
Improved compatibility with old versions of MinGW (#129, #130, #132). Thanks to @cstamford (Christopher Stamford).
-
Fixed a compile error on MSVC with disabled exceptions (#144).
-
Added a workaround for broken implementation of variadic templates in MSVC2012 (#148).
-
Placed the anonymous namespace within
fmt
namespace for the header-only configuration (#171). Thanks to @alfps (Alf P. Steinbach). -
Implemented a workaround for a name lookup bug in MSVC2010 (#188).
-
Fixed compiler warnings (#95, #96, #114, #135, #142, #145, #146, #158, #163, #175, #190, #191, #194, #196, #216, #218, #220, #229, #233, #234, #236). Thanks to @seanmiddleditch (Sean Middleditch), @dixlorenz (Dix Lorenz), @CarterLi (李通洲), @Naios, @fmatthew5876 (Matthew Fioravante), @LevskiWeng (Levski Weng), @rpopescu, @gabime (Gabi Melman), @cubicool (Jeremy Moles), @jkflying (Julian Kent), @LogicalKnight (Sean L), @inguin (Ingo van Lil) and @Jopie64 (Johan).
-
Fixed portability issues (mostly causing test failures) on ARM, ppc64, ppc64le, s390x and SunOS 5.11 i386 ( #138, #179, #180, #202, #225, Red Hat Bugzilla Bug 1260297). Thanks to @Naios, @jackyf (Eugene V. Lyubimkin) and Dave Johansen.
-
Fixed a name conflict with macro
free
defined incrtdbg.h
when_CRTDBG_MAP_ALLOC
is set (#211). -
Fixed shared library build on OS X (#212). Thanks to @dean0x7d (Dean Moldovan).
-
Fixed an overload conflict on MSVC when
/Zc:wchar_t-
option is specified (#214). Thanks to @slavanap (Vyacheslav Napadovsky). -
Improved compatibility with MSVC 2008 (#236). Thanks to @Jopie64 (Johan).
-
Improved compatibility with bcc32 (#227).
-
Fixed
static_assert
detection on Clang (#228). Thanks to @dean0x7d (Dean Moldovan).