C++ Format v2.0.0 Release Notes

Release Date: 2015-12-01 // over 8 years ago
  • General

    
    * [Breaking] Named arguments
      (`#169 <https://github.com/fmtlib/fmt/pull/169>`_,
      `#173 <https://github.com/fmtlib/fmt/pull/173>`_,
      `#174 <https://github.com/fmtlib/fmt/pull/174>`_):
    
      .. code:: c++
    
        fmt::print("The answer is {answer}.", fmt::arg("answer", 42));
    
      Thanks to `@jamboree <https://github.com/jamboree>`_.
    
    * [Experimental] User-defined literals for format and named arguments
      (`#204 <https://github.com/fmtlib/fmt/pull/204>`_,
      `#206 <https://github.com/fmtlib/fmt/pull/206>`_,
      `#207 <https://github.com/fmtlib/fmt/pull/207>`_):
    
      .. code:: c++
    
        using namespace fmt::literals;
        fmt::print("The answer is {answer}.", "answer"_a=42);
    
      Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.
    
    * ๐Ÿ‘ [Breaking] Formatting of more than 16 arguments is now supported when using
      variadic templates
      (`#141 <https://github.com/fmtlib/fmt/issues/141>`_).
      Thanks to `@Shauren <https://github.com/Shauren>`_.
    
    * โš™ Runtime width specification
      (`#168 <https://github.com/fmtlib/fmt/pull/168>`_):
    
      .. code:: c++
    
        fmt::format("{0:{1}}", 42, 5); // gives "   42"
    
      Thanks to `@jamboree <https://github.com/jamboree>`_.
    
    * [Breaking] Enums are now formatted with an overloaded ``std::ostream`` insertion
      operator (``operator<<``) if available
      (`#232 <https://github.com/fmtlib/fmt/issues/232>`_).
    
    * 0๏ธโƒฃ [Breaking] Changed default ``bool`` format to textual, "true" or "false"
      (`#170 <https://github.com/fmtlib/fmt/issues/170>`_):
    
      .. code:: c++
    
        fmt::print("{}", true); // prints "true"
    
      To print ``bool`` as a number use numeric format specifier such as ``d``:
    
      .. code:: c++
    
        fmt::print("{:d}", true); // prints "1"
    
    * ๐Ÿ–จ ``fmt::printf`` and ``fmt::sprintf`` now support formatting of ``bool`` with the
      ``%s`` specifier giving textual output, "true" or "false"
      (`#223 <https://github.com/fmtlib/fmt/pull/223>`_):
    
      .. code:: c++
    
        fmt::printf("%s", true); // prints "true"
    
      Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.
    
    * 0๏ธโƒฃ [Breaking] ``signed char`` and ``unsigned char`` are now formatted as integers by default
      (`#217 <https://github.com/fmtlib/fmt/pull/217>`_).
    
    * [Breaking] Pointers to C strings can now be formatted with the ``p`` specifier
      (`#223 <https://github.com/fmtlib/fmt/pull/223>`_):
    
      .. code:: c++
    
        fmt::print("{:p}", "test"); // prints pointer value
    
      Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.
    
    * ๐Ÿ–จ [Breaking] ``fmt::printf`` and ``fmt::sprintf`` now print null pointers as ``(nil)``
      and null strings as ``(null)`` for consistency with glibc
      (`#226 <https://github.com/fmtlib/fmt/pull/226>`_).
      Thanks to `@LarsGullik <https://github.com/LarsGullik>`_.
    
    * ๐Ÿ–จ [Breaking] ``fmt::(s)printf`` now supports formatting of objects of user-defined types
      that provide an overloaded ``std::ostream`` insertion operator (``operator<<``)
      (`#201 <https://github.com/fmtlib/fmt/issues/201>`_):
    
      .. code:: c++
    
        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 <https://github.com/fmtlib/fmt/issues/140>`_).
      Thanks to `@polyvertex (Jean-Charles Lefebvre) <https://github.com/polyvertex>`_.
    
    * [Breaking] Improved compatibility between ``BasicStringRef`` and
      `std::experimental::basic_string_view
      <http://en.cppreference.com/w/cpp/experimental/basic_string_view>`_
      (`#100 <https://github.com/fmtlib/fmt/issues/100>`_,
      `#159 <https://github.com/fmtlib/fmt/issues/159>`_,
      `#183 <https://github.com/fmtlib/fmt/issues/183>`_):
    
      - Comparison operators now compare string content, not pointers
      - ``BasicStringRef::c_str`` replaced by ``BasicStringRef::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 <https://github.com/fmtlib/fmt/issues/185>`_).
    
    * New CMake options ``FMT_DOC``, ``FMT_INSTALL`` and ``FMT_TEST`` to control
      generation of ``doc``, ``install`` and ``test`` targets respectively, on by default
      (`#197 <https://github.com/fmtlib/fmt/issues/197>`_,
      `#198 <https://github.com/fmtlib/fmt/issues/198>`_,
      `#200 <https://github.com/fmtlib/fmt/issues/200>`_).
      Thanks to `@maddinat0r (Alex Martin) <https://github.com/maddinat0r>`_.
    
    * ``noexcept`` is now used when compiling with MSVC2015
      (`#215 <https://github.com/fmtlib/fmt/pull/215>`_).
      Thanks to `@dmkrepo (Dmitriy) <https://github.com/dmkrepo>`_.
    
    * ๐Ÿ‘‰ Added an option to disable use of ``windows.h`` when ``FMT_USE_WINDOWS_H``
      is defined as 0 before including ``format.h``
      (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).
      Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.
    
    * ๐Ÿ [Breaking] ``windows.h`` is now included with ``NOMINMAX`` unless
      ``FMT_WIN_MINMAX`` is defined. This is done to prevent breaking code using
      ``std::min`` and ``std::max`` and only affects the header-only configuration
      (`#152 <https://github.com/fmtlib/fmt/issues/152>`_,
      `#153 <https://github.com/fmtlib/fmt/pull/153>`_,
      `#154 <https://github.com/fmtlib/fmt/pull/154>`_).
      Thanks to `@DevO2012 <https://github.com/DevO2012>`_.
    
    * ๐Ÿ‘Œ Improved support for custom character types
      (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).
      Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.
    
    * ๐Ÿ‘‰ Added an option to disable use of IOStreams when ``FMT_USE_IOSTREAMS``
      is defined as 0 before including ``format.h``
      (`#205 <https://github.com/fmtlib/fmt/issues/205>`_,
      `#208 <https://github.com/fmtlib/fmt/pull/208>`_).
      Thanks to `@JodiTheTigger <https://github.com/JodiTheTigger>`_.
    
    * ๐Ÿ‘Œ Improved detection of ``isnan``, ``isinf`` and ``signbit``.
    
    Optimization
    
    • Made formatting of user-defined types more efficient with a custom stream buffer (#92 <https://github.com/fmtlib/fmt/issues/92>, #230 <https://github.com/fmtlib/fmt/pull/230>). Thanks to @NotImplemented <https://github.com/NotImplemented>_.

    • ๐ŸŽ Further improved performance of fmt::Writer on integer formatting and fixed a minor regression. Now it is ~7% faster than karma::generate on Karma's benchmark (#186 <https://github.com/fmtlib/fmt/issues/186>_).

    • [Breaking] Reduced compiled code size <https://github.com/fmtlib/fmt#compile-time-and-code-bloat>_ (#143 <https://github.com/fmtlib/fmt/issues/143>, #149 <https://github.com/fmtlib/fmt/pull/149>).

    Distribution

    
    * [Breaking] Headers are now installed in
      ``${CMAKE_INSTALL_PREFIX}/include/cppformat``
      (`#178 <https://github.com/fmtlib/fmt/issues/178>`_).
      Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.
    
    * [Breaking] Changed the library name from ``format`` to ``cppformat``
      for consistency with the project name and to avoid potential conflicts
      (`#178 <https://github.com/fmtlib/fmt/issues/178>`_).
      Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.
    
    * ๐Ÿง C++ Format is now available in `Debian <https://www.debian.org/>`_ GNU/Linux
      (`stretch <https://packages.debian.org/source/stretch/cppformat>`_,
      `sid <https://packages.debian.org/source/sid/cppformat>`_) and 
      derived distributions such as
      `Ubuntu <https://launchpad.net/ubuntu/+source/cppformat>`_ 15.10 and later
      (`#155 <https://github.com/fmtlib/fmt/issues/155>`_)::
    
        $ sudo apt-get install libcppformat1-dev
    
      Thanks to `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_.
    
    * ๐Ÿ“ฆ `Packages for Fedora and RHEL <https://admin.fedoraproject.org/pkgdb/package/cppformat/>`_
      are now available. Thanks to Dave Johansen.
    
    * C++ Format can now be installed via `Homebrew <http://brew.sh/>`_ on OS X
      (`#157 <https://github.com/fmtlib/fmt/issues/157>`_)::
    
        $ brew install cppformat
    
      Thanks to `@ortho <https://github.com/ortho>`_, Anatoliy Bulukin.
    
    ๐Ÿ“š Documentation
    
    • ๐Ÿ“ฑ Migrated from ReadTheDocs to GitHub Pages for better responsiveness and reliability (#128 <https://github.com/fmtlib/fmt/issues/128>_). New documentation address is http://cppformat.github.io/.

    • โž• Added Building the documentation <https://fmt.dev/2.0.0/usage.html#building-the-documentation>_ section to the documentation.

    • ๐Ÿ“š Documentation build script is now compatible with Python 3 and newer pip versions. (#189 <https://github.com/fmtlib/fmt/pull/189>, #209 <https://github.com/fmtlib/fmt/issues/209>). Thanks to @JodiTheTigger <https://github.com/JodiTheTigger>_ and @xentec <https://github.com/xentec>_.

    • ๐Ÿ“š Documentation fixes and improvements (#36 <https://github.com/fmtlib/fmt/issues/36>, #75 <https://github.com/fmtlib/fmt/issues/75>, #125 <https://github.com/fmtlib/fmt/issues/125>, #160 <https://github.com/fmtlib/fmt/pull/160>, #161 <https://github.com/fmtlib/fmt/pull/161>, #162 <https://github.com/fmtlib/fmt/issues/162>, #165 <https://github.com/fmtlib/fmt/issues/165>, #210 <https://github.com/fmtlib/fmt/issues/210>). Thanks to @syohex (Syohei YOSHIDA) <https://github.com/syohex>_ and bug reporters.

    • ๐Ÿ›  Fixed out-of-tree documentation build (#177 <https://github.com/fmtlib/fmt/issues/177>). Thanks to @jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>.

    ๐Ÿ›  Fixes

    
    * ๐Ÿ›  Fixed ``initializer_list`` detection
      (`#136 <https://github.com/fmtlib/fmt/issues/136>`_).
      Thanks to `@Gachapen (Magnus Bjerke Vik) <https://github.com/Gachapen>`_.
    
    * ๐Ÿ›  [Breaking] Fixed formatting of enums with numeric format specifiers in
      ``fmt::(s)printf`` 
      (`#131 <https://github.com/fmtlib/fmt/issues/131>`_,
      `#139 <https://github.com/fmtlib/fmt/issues/139>`_):
    
      .. code:: c++
    
        enum { ANSWER = 42 };
        fmt::printf("%d", ANSWER);
    
      Thanks to `@Naios <https://github.com/Naios>`_.
    
    * ๐Ÿ‘Œ Improved compatibility with old versions of MinGW
      (`#129 <https://github.com/fmtlib/fmt/issues/129>`_,
      `#130 <https://github.com/fmtlib/fmt/pull/130>`_,
      `#132 <https://github.com/fmtlib/fmt/issues/132>`_).
      Thanks to `@cstamford (Christopher Stamford) <https://github.com/cstamford>`_.
    
    * ๐Ÿ›  Fixed a compile error on MSVC with disabled exceptions
      (`#144 <https://github.com/fmtlib/fmt/issues/144>`_).
    
    * โž• Added a workaround for broken implementation of variadic templates in MSVC2012
      (`#148 <https://github.com/fmtlib/fmt/issues/148>`_).
    
    * Placed the anonymous namespace within ``fmt`` namespace for the header-only
      configuration
      (`#171 <https://github.com/fmtlib/fmt/issues/171>`_).
      Thanks to `@alfps (Alf P. Steinbach) <https://github.com/alfps>`_.
    
    * ๐Ÿ›  Fixed issues reported by Coverity Scan
      (`#187 <https://github.com/fmtlib/fmt/issues/187>`_,
      `#192 <https://github.com/fmtlib/fmt/issues/192>`_).
    
    * โ†ช Implemented a workaround for a name lookup bug in MSVC2010
      (`#188 <https://github.com/fmtlib/fmt/issues/188>`_).
    
    * ๐Ÿ›  Fixed compiler warnings
      (`#95 <https://github.com/fmtlib/fmt/issues/95>`_,
      `#96 <https://github.com/fmtlib/fmt/issues/96>`_,
      `#114 <https://github.com/fmtlib/fmt/pull/114>`_,
      `#135 <https://github.com/fmtlib/fmt/issues/135>`_,
      `#142 <https://github.com/fmtlib/fmt/issues/142>`_,
      `#145 <https://github.com/fmtlib/fmt/issues/145>`_,
      `#146 <https://github.com/fmtlib/fmt/issues/146>`_,
      `#158 <https://github.com/fmtlib/fmt/issues/158>`_,
      `#163 <https://github.com/fmtlib/fmt/issues/163>`_,
      `#175 <https://github.com/fmtlib/fmt/issues/175>`_,
      `#190 <https://github.com/fmtlib/fmt/issues/190>`_,
      `#191 <https://github.com/fmtlib/fmt/pull/191>`_,
      `#194 <https://github.com/fmtlib/fmt/issues/194>`_,
      `#196 <https://github.com/fmtlib/fmt/pull/196>`_,
      `#216 <https://github.com/fmtlib/fmt/issues/216>`_,
      `#218 <https://github.com/fmtlib/fmt/pull/218>`_,
      `#220 <https://github.com/fmtlib/fmt/pull/220>`_,
      `#229 <https://github.com/fmtlib/fmt/pull/229>`_,
      `#233 <https://github.com/fmtlib/fmt/issues/233>`_,
      `#234 <https://github.com/fmtlib/fmt/issues/234>`_,
      `#236 <https://github.com/fmtlib/fmt/pull/236>`_,
      `#281 <https://github.com/fmtlib/fmt/issues/281>`_,
      `#289 <https://github.com/fmtlib/fmt/issues/289>`_).
      Thanks to `@seanmiddleditch (Sean Middleditch) <https://github.com/seanmiddleditch>`_,
      `@dixlorenz (Dix Lorenz) <https://github.com/dixlorenz>`_,
      `@CarterLi (ๆŽ้€šๆดฒ) <https://github.com/CarterLi>`_,
      `@Naios <https://github.com/Naios>`_,
      `@fmatthew5876 (Matthew Fioravante) <https://github.com/fmatthew5876>`_,
      `@LevskiWeng (Levski Weng) <https://github.com/LevskiWeng>`_,
      `@rpopescu <https://github.com/rpopescu>`_,
      `@gabime (Gabi Melman) <https://github.com/gabime>`_,
      `@cubicool (Jeremy Moles) <https://github.com/cubicool>`_,
      `@jkflying (Julian Kent) <https://github.com/jkflying>`_,
      `@LogicalKnight (Sean L) <https://github.com/LogicalKnight>`_,
      `@inguin (Ingo van Lil) <https://github.com/inguin>`_ and
      `@Jopie64 (Johan) <https://github.com/Jopie64>`_.
    
    * ๐Ÿ›  Fixed portability issues (mostly causing test failures) on ARM, ppc64, ppc64le,
      s390x and SunOS 5.11 i386
      (`#138 <https://github.com/fmtlib/fmt/issues/138>`_,
      `#179 <https://github.com/fmtlib/fmt/issues/179>`_,
      `#180 <https://github.com/fmtlib/fmt/issues/180>`_,
      `#202 <https://github.com/fmtlib/fmt/issues/202>`_,
      `#225 <https://github.com/fmtlib/fmt/issues/225>`_,
      `Red Hat Bugzilla Bug 1260297 <https://bugzilla.redhat.com/show_bug.cgi?id=1260297>`_).
      Thanks to `@Naios <https://github.com/Naios>`_,
      `@jackyf (Eugene V. Lyubimkin) <https://github.com/jackyf>`_ and Dave Johansen.
    
    * ๐Ÿ›  Fixed a name conflict with macro ``free`` defined in
      ``crtdbg.h`` when ``_CRTDBG_MAP_ALLOC`` is set
      (`#211 <https://github.com/fmtlib/fmt/issues/211>`_).
    
    * ๐Ÿ›  Fixed shared library build on OS X
      (`#212 <https://github.com/fmtlib/fmt/pull/212>`_).
      Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.
    
    * ๐Ÿ›  Fixed an overload conflict on MSVC when ``/Zc:wchar_t-`` option is specified
      (`#214 <https://github.com/fmtlib/fmt/pull/214>`_).
      Thanks to `@slavanap (Vyacheslav Napadovsky) <https://github.com/slavanap>`_.
    
    * ๐Ÿ‘Œ Improved compatibility with MSVC 2008
      (`#236 <https://github.com/fmtlib/fmt/pull/236>`_).
      Thanks to `@Jopie64 (Johan) <https://github.com/Jopie64>`_.
    
    * ๐Ÿ‘Œ Improved compatibility with bcc32
      (`#227 <https://github.com/fmtlib/fmt/issues/227>`_).
    
    * ๐Ÿ›  Fixed ``static_assert`` detection on Clang
      (`#228 <https://github.com/fmtlib/fmt/pull/228>`_).
      Thanks to `@dean0x7d (Dean Moldovan) <https://github.com/dean0x7d>`_.