fmt(原fmtlib)是C++中高性能、类型安全、易用的格式化库,比printf和std::ostringstream更快更简洁,C++20 std::format基于它设计,支持编译期检查、自定义类型格式化、跨平台及轻量单头使用。

fmtlib(现在叫 fmt)是 C++ 中性能极佳、类型安全、易用的格式化库,比 printf 和 std::ostringstream 更快更简洁,C++20 的 std::format 就是基于它设计的。它支持编译期检查、自定义类型格式化、跨平台,且头文件轻量(也可静态链接)。
快速上手:安装与基础用法
推荐使用 vcpkg 或 Conan 管理依赖,或直接下载单头版(fmt/format.h):
- GitHub 地址:https://www.php.cn/link/02251d47085ed33996c248c852dd3fa3
- 单头版:下载
fmt/format.h放入项目即可(无需编译) - 基础格式化写法类似 Python 的 f-string:
#include#include int main() { std::string s = fmt::format("Hello, {}! You have {} messages.", "Alice", 42); std::cout << s << "\n"; // 输出:Hello, Alice! You have 42 messages. }
进阶技巧:格式说明符与类型支持
fmt 支持丰富的格式说明符,语法统一、直观,且自动推导类型:
-
{}:自动类型推导(支持 int、double、string、vector 等内置/STL 类型) -
{:d}十进制,{:x}十六进制,{:.2f}保留两位小数 -
{:>10}右对齐占宽 10,{:^8}居中,{: 左对齐 -
{:+d}强制显示符号,{:08x}补零八位十六进制
fmt::print("pi ≈ {:.6f}, hex={:08x}, flag={:+d}\n", 3.1415926, 255, -7);
// 输出:pi ≈ 3.141593, hex=000000ff, flag=-7
自定义类型格式化(关键能力)
让自己的结构体或类支持 fmt 格式化,只需特化 fmt::formatter 模板:
立即学习“C++免费学习笔记(深入)”;
- 定义
parse()解析格式说明符(如{:s}) - 实现
format()返回格式化后的字符串视图 - 推荐用
FMT_STRING宏启用编译期检查(可选但强烈建议)
#includestruct Point { int x, y; }; template <> struct fmt::formatter { constexpr auto parse(format_parse_context& ctx) { return ctx.begin(); } template auto format(const Point& p, FormatContext& ctx) { return fmt::format_to(ctx.out(), "({},{})", p.x, p.y); } }; // 使用 fmt::print("Origin: {}\n", Point{0, 0}); // 输出:Origin: (0,0)
高性能提示:避免运行时解析、用 print 替代 string 构造
fmt 的高性能核心在于:格式字符串在编译期解析(配合 FMT_STRING),且 fmt::print 直接输出到 stdout / file,不构造中间 string:
- 用
fmt::print("msg: {}\n", x)替代std::cout (更安全、更快) - 日志场景优先用
fmt::println或fmt::print(stderr, ...) - C++20 起可直接用
std::format(行为与 fmt 兼容,但部分高级特性需 fmt)











