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):
fmt/format.h 放入项目即可(无需编译)#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_t o(ctx.out(), "({},{})", p.x, p.y); } }; // 使用 fmt::print("Origin: {}\n", Point{0, 0}); // 输出:Origin: (0,0)
fmt 的高性能核心在于:格式字符串在编译期解析(配合 FMT_STRING),且 fmt::print 直接输出到 stdout / file,不构造中间 string:
fmt::print("msg: {}\n", x) 替代 std::cout (更安全、更快)
fmt::println 或 fmt::print(stderr, ...)
std::format(行为与 fmt 兼容,但部分高级特性需 fmt)