25,509 颗星的 fmt 发布 v12.2.0:C11 API 加入,一个最初为 C++ 设计的格式化库正在向 C 渗透
大多数 C++ 项目都会在依赖列表里写一行 {fmt},但真正把它用到位的人并不多。上周发布的 v12.2.0 带来了一个值得关注的新能力:原生 C11 API——这意味着一个最初为 C++ 设计的格式化库,正在向纯 C 代码渗透。
25,509 颗星、3,035 个 Fork、上一次提交就在昨天(2026-09-04),fmtlib/fmt 是 C++ 生态中少有的零争议基础设施。
它解决了什么问题
C 里有 printf,C++ 里有 iostream,但两者都有明显缺陷:printf 不是类型安全的,iostream 慢且 API 繁琐。fmt 站在两者中间,提供了一套既安全又快、语法还像 Python 一样的格式化方案。
核心 API 长这样:
#include <fmt/core.h>
std::string s = fmt::format("The answer is {}.", 42);
fmt::print("Hello, {}!n", "world");
位置参数让本地化变得干净:
fmt::format("{1} died in {0}.", "1770", "Bach"); // Bach died in 1770.
比起 printf("%s died in %s.", ...) 的阅读顺序倒置,这显然更符合人类直觉。
性能到底怎么样
官方 benchmark 页面(https://fmt.dev)有完整的对比数据。以 to_chars(C++17 里 std::to_chars 的前身)为基准,fmt 在多数场景下比 GCC/Clang 的标准实现快 20–40%。在浮点数格式化这个传统痛点上,v12.0 引入的 Dragonbox 算法将 double 格式化速度提升了 60% 以上(相比 v11.2)。
v12.1.0 针对 spdlog 常用路径做了专门优化,buffer::append 改写后在 spdlog benchmark 里快了约 16%。这对大量打日志的场景是直接受益。
连续九年在 oss-fuzz 上做模糊测试,安全性这块有外部力量持续盯着。
谁在用
从项目 README 可以看到的用户包括 LLVM、Microsoft(部分产品)、Chrome(部分模块)、PyTorch(数据加载)。开源圈子里,fmt 基本是”隐形冠军”——你没注意它,但它每天在百万台机器上运行。
v12.2.0 的 C11 API:值得注意的信号
这是 fmt 历史上第一次为纯 C 代码提供一级支持。用 _Generic 做类型分派,在 C 代码里实现了这样的 API:
#include <fmt/fmt-c.h>
fmt_print(stdout, "The answer is {}.n", 42);
官方称这个 C API 性能比传统 printf/sprintf 更高。如果你维护的是纯 C 项目,又对性能有要求,这比魔改 printf 强得多。
对于 C++ 开发者来说,这个更新的直接影响不大——C++ 这一侧 fmt 早就完整支持了。但它说明 fmt 的定位在扩大:从”给 C++ 程序员的高级 printf”,变成了”所有 C 家族语言的现代格式化基础设施”。
适合谁 / 不适合谁
适合:
- C++ 项目追求高性能日志或序列化
- 已有代码用
sprintf/snprintf,想迁移到类型安全方案 - 嵌入式 C 项目需要比 glibc printf 更快的实现
- 需要本地化支持(位置参数)
不适合:
- 需要完整 iostream 语法的场景(fmt 不打算替代 iostream)
- 对二进制序列化有需求(fmt 是文本格式化,不是 protobuf 替代品)
- 已有代码重度依赖 C++20
std::format且性能已满足需求(fmt 在这个场景优势不大)
项目边界
fmt 是一个头文件优先的库(大部分功能在头文件里),也可以单独编译成静态库。MIT 许可,零商业限制。跨平台:Windows/msvc、Linux/gcc/clang、macOS/clang,全套 CI 在 GitHub Actions 上跑。
下一步建议
如果你的项目还没用 fmt:
- 尝试在 Compiler Explorer 里跑一下官方 demo:https://godbolt.org/z/8Mx1EW73v,不需要安装
- 如果项目用 CMake,
FetchContent一行引入即可,不需要子模块 - 如果你在维护一个 C 项目,v12.2.0 的 C API 值得评估——benchmark 数据显示在某些场景下有显著收益
- 关注 fmt.dev 文档里的”Compile-time format string checks”部分,这是 fmt 相比 printf 最有价值的差异化能力之一
GitHub: https://github.com/fmtlib/fmt
文档: https://fmt.dev
评论区
登录后可评论。