编程 {fmt}:登上今日 GitHub 热榜的现代 C++ 格式化库

2026-09-05 15:09:20

{fmt}:登上今日 GitHub 热榜的现代 C++ 格式化库

今天登上 GitHub Trending 每日榜的一个"老面孔"是 {fmt}(fmtlib/fmt)——一款已经存在十余年、Star 超过 2.4 万的 C++ 开源格式化库。一个成熟库能持续出现在热榜上,说明它依然被大量开发者使用和关注。

{fmt} 的定位一句话说清:C 语言 printf/iostream 的现代替代方案,更快、更安全、更易用。

项目地址:https://github.com/fmtlib/fmt

一、它解决什么问题

C++ 传统的格式化输出主要有两条路:

  • printf 系列:快,但类型不安全,格式串写错容易导致未定义行为
  • iostream 系列:类型安全,但语法啰嗦、性能较差、编译慢

{fmt} 把两者的优点合到一起:像 Python 的 format 一样简洁的格式串语法 + 类型安全 + 高性能。更关键的是,它的设计已经被标准采纳——C++20 的 std::format 和 C++23 的 std::print 就是基于 {fmt} 的实现。

二、核心特性

  • 实现 C++20 std::format 与 C++23 std::print:用法与标准库一致,未来可无缝迁移
  • Python 风格格式串fmt::format("The answer is {}.", 42)
  • 位置参数:支持 {1}{0} 这样的顺序引用,方便本地化
  • 高性能浮点格式化:基于 Dragonbox 算法,正确舍入、输出短且可往返
  • 编译期检查:格式串错误在编译期就能报出来
  • 类型安全:自动内存管理,防止缓冲区溢出
  • 体积小、无依赖:最小配置只需 base.hformat.hformat-inl.h 三个文件
  • MIT 协议、可仅头文件使用(FMT_HEADER_ONLY

三、快速上手

#include <fmt/base.h>

int main() {
    fmt::print("Hello, world!\n");
}
#include <fmt/base.h>
#include <string>

int main() {
    std::string s = fmt::format("The answer is {}.", 42);
    // s == "The answer is 42."
}

格式化容器、时间日期、带颜色的输出也都有现成支持:

#include <vector>
#include <fmt/ranges.h>

int main() {
    std::vector<int> v = {1, 2, 3};
    fmt::print("{}\n", v);  // 输出 [1, 2, 3]
}

单线程写文件时,fmt::output_filefprintf 最高可快约 9 倍(官方测试数据)。

四、为什么值得关注

对于还在用 printf/iostream 的老项目,{fmt} 提供了一条低风险的升级路径:先是第三方库,等代码库逐步切到 C++20 后,可以直接换用标准库版本。对新项目而言,直接用 std::format(底层就是 {fmt} 的实现)也是推荐做法。

此外 {fmt} 的工程实践也值得学习:持续 fuzzing、全面的测试集、高告警级别下零警告的代码质量,这些都是生产级库应有的标准。

项目地址:https://github.com/fmtlib/fmt

复制全文 生成海报 C++ fmt 开源

推荐文章

程序员茄子在线接单