C++ libfmt 实战: 高效简便的格式化库
libfmt 是一个现代化的 C++格式化库{fmt}
, 具有以下关键特性:
- 安全性: 受 Python 格式化功能启发,
{fmt}
为printf
系列函数提供安全替代方案. 格式字符串错误在编译时就能被检测出来, 并且通过自动内存管理避免缓冲区溢出错误. - 可扩展性: 默认支持格式化大多数标准类型, 包括容器, 日期和时间等. 例如, 能以类似 JSON 的格式打印
std::vector
. 同时, 用户也能让自定义类型支持格式化, 并进行编译时检查. - 高性能: 在数值格式化方面,
{fmt}
比iostreams
和sprintf
快很多, 速度提升范围从百分之几十到 20 - 30 倍不等. 它尽量减少动态内存分配, 还能将格式字符串编译为优化代码. - Unicode 支持: 在主流操作系统上,
{fmt}
通过UTF-8
和char
字符串提供可移植的 Unicode 支持. 默认情况下与区域设置无关, 但也可选择本地化格式化, 解决了标准库在这方面的一些问题. - 编译速度快: 该库大量使用类型擦除技术来加快编译速度.
fmt/base.h
提供的 API 子集, 包含极少的依赖, 却足以替代所有*printf
的使用场景. 使用{fmt}
的代码编译速度通常比等效的iostreams
代码快几倍, 虽然printf
编译速度更快, 但差距正在缩小. - 二进制体积小: 类型擦除技术还能防止模板膨胀, 使得每次调用生成的二进制代码更紧凑.
- 可移植性强:
{fmt}
代码库独立且小巧, 核心仅由三个头文件组成, 无外部依赖.
本文将介绍libfmt
的安装以及使用教程. 让读者一文了解其功能.
安装教程
通过
vcpkg
安装. 如果对 vcpkg 不熟悉, 可以参考我的博客: Vcpkg 使用全攻略: 支持 VS Code, Visual Studio 和 CLion接着在
CMakeLists.txt
中使用:通过 CMake
FetchContent
方法. 如果您对 CMake 不是很熟悉, 可以参考我的博客: CMake 入门教程: 从基础到实践嵌入使用(Embed). 将
libfmt
仓库加入到自己的工程, 作为一个组件使用.- 先克隆仓库到本地
- 在
CMakeLists.txt
中使用:
使用教程
格式化方式
基础样例
fmt 库采用
{}
做占位符. 与 Python 的格式化方式很接近.指定参数位置
整数格式化
浮点数格式化
对齐和宽度
时间格式化
关于时间格式请参考: fmt syntax
画 Unicode 字符
输出:
本节的完整代码请参考basic.cpp
打印容器
打印标准容器
嵌套容器
格式化组合
本节完整代码请参考: container.cpp
对传统代码的替代
性能对比
下图是官网给出的速度对比, 数值越小表示耗时越少.

替换传统 API
本节完整代码请参考: stream.cpp
总结
libfmt
作为一个现代的 C++ 格式化库, 其性能强大, 使用方便同时安全性高. 其不少特性已经被引入 C++标准库(容器部分尚未引入). 感兴趣的读者建议下载尝试.