{fmt}:高效、安全的C++格式化库
fmt A modern formatting library 项目地址: https://gitcode.com/gh_mirrors/fm/fmt
项目介绍
{fmt} 是一个开源的C++格式化库,旨在提供比C标准库的stdio和C++的iostreams更快、更安全的替代方案。它不仅实现了C++20的
std::format
和C++23的
std::print
,还提供了类似于Python的格式化字符串语法。{fmt} 的设计目标是高性能、小代码体积、高可靠性和易用性,适用于各种C++项目。
项目技术分析
{fmt} 的核心技术包括:
- 格式化API:提供简单且支持位置参数的格式化API,便于本地化。
- C++20/23标准实现:完全兼容C++20的
std::format
和C++23的std::print
。 - 高性能浮点格式化:使用Dragonbox算法,确保IEEE 754浮点数的正确舍入、短格式和往返保证。
- 安全printf实现:支持POSIX扩展的位置参数,避免缓冲区溢出。
- 可扩展性:支持用户自定义类型的格式化。
- 高可靠性:通过广泛的测试和持续的模糊测试确保代码的可靠性。
项目及技术应用场景
{fmt} 适用于以下场景:
- 高性能计算:在需要快速格式化大量数据的场景中,如科学计算、数据处理等。
- 嵌入式系统:由于其小代码体积和高效性能,适合资源受限的嵌入式环境。
- 跨平台开发:提供一致的输出和良好的跨平台支持,适用于多平台开发。
- 安全敏感应用:通过类型安全检查和自动内存管理,减少格式化错误和缓冲区溢出风险。
项目特点
- 高性能:比常见的标准库实现(如
(s)printf
、iostreams、to_string
和to_chars
)更快。 - 小代码体积:最小配置仅包含三个文件,编译后的代码体积小。
- 高可靠性:通过广泛的测试和持续的模糊测试确保代码的可靠性。
- 安全性:完全类型安全,错误格式字符串可在编译时报告,自动内存管理防止缓冲区溢出。
- 易用性:代码库小且自包含,无外部依赖,采用宽松的MIT许可证。
- 跨平台支持:在不同平台上提供一致的输出,支持旧版编译器。
- 警告自由:即使在高警告级别(如
-Wall -Wextra -pedantic
)下,代码库也保持干净无警告。 - 本地独立:默认情况下不依赖于本地化设置。
- 可选头文件配置:通过
FMT_HEADER_ONLY
宏启用头文件配置。
示例代码
以下是一些使用{fmt}的示例代码:
打印到标准输出
#include <fmt/core.h>
int main() {
fmt::print("Hello, world!\n");
}
格式化字符串
std::string s = fmt::format("The answer is {}.", 42);
// s == "The answer is 42."
使用位置参数格式化字符串
std::string s = fmt::format("I'd rather be {1} than {0}.", "right", "happy");
// s == "I'd rather be happy than right."
打印日期和时间
#include <fmt/chrono.h>
int main() {
auto now = std::chrono::system_clock::now();
fmt::print("Date and time: {}\n", now);
fmt::print("Time: {:%H:%M}\n", now);
}
打印容器
#include <vector>
#include <fmt/ranges.h>
int main() {
std::vector<int> v = {1, 2, 3};
fmt::print("{}\n", v);
}
编译时检查格式字符串
std::string s = fmt::format("{:d}", "I am not a number");
单线程写文件
#include <fmt/os.h>
int main() {
auto out = fmt::output_file("guide.txt");
out.print("Don't {}", "Panic");
}
彩色和样式文本打印
#include <fmt/color.h>
int main() {
fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold,
"Hello, {}!\n", "world");
fmt::print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) |
fmt::emphasis::underline, "Olá, {}!\n", "Mundo");
fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
"你好{}!\n", "世界");
}
性能测试
{fmt} 在性能测试中表现出色,比
printf
快约20%,比
std::ostringstream
和
sprintf
快20-30倍。在编译时间和代码体积方面,{fmt} 也表现优异,与
printf
相当。
总结
{fmt} 是一个功能强大、性能卓越的C++格式化库,适用于各种高性能、高安全性的应用场景。无论你是开发嵌入式系统、跨平台应用,还是进行科学计算,{fmt} 都能为你提供高效、安全的格式化解决方案。快来尝试吧!
fmt A modern formatting library 项目地址: https://gitcode.com/gh_mirrors/fm/fmt
版权归原作者 宋韵庚 所有, 如有侵权,请联系我们删除。