
在C++20中,std::format 的引入让字符串格式化变得安全、高效且易于使用。它借鉴了Python的 str.format() 和 Rust 的 format! 语法,取代了传统的 printf 和 std::ostringstream 等容易出错的方式。
std::format 基本用法
std::format 位于 头文件中,使用方式类似于 printf,但基于类型安全的模板机制,不会因类型不匹配导致崩溃。
基本语法是:
std::format("Hello, {}!", "world"); // 输出: Hello, world!支持按位置或名称填充:
立即学习“C++免费学习笔记(深入)”;
- std::format("The value of {} is {}", "x", 42);
- std::format("Hi {name}, you are {age} years old.", fmt::arg("name", "Alice"), fmt::arg("age", 30));(命名参数需第三方库如 fmt 支持,原生C++20暂未完全支持命名)
格式化数字与控制输出
可以像 printf 一样控制整数进制、浮点精度等。
- std::format("{:d}", 100) → 十进制
- std::format("{:x}", 255) → 十六进制:ff
- std::format("{:X}", 255) → 大写:FF
- std::format("{:o}", 7) → 八进制:7
- std::format("{:.2f}", 3.14159) → 保留两位小数:3.14
- std::format("{:>10}", "hi") → 右对齐,宽度10
- std::format("{:+}", 42) → 显示正号:+42
格式化自定义类型
要让 std::format 支持自定义类,需要特化 std::formatter 模板。
例如有一个 Point 类:
为其添加格式化支持:
template struct std::formatter然后就可以直接使用:
std::format("Origin: {}", Point{0, 0}); // 输出: Origin: (0,0)性能与注意事项
std::format 在编译期会做部分检查,减少运行时错误。相比 sprintf 更安全,避免缓冲区溢出。
但注意:
- 编译器需完整支持 C++20 格式库(如 MSVC 2019 Update 9+,GCC 13+ 推荐)
- 某些旧版 libstdc++ 不完整支持,可考虑使用 fmt 库作为替代,其语法几乎一致且更成熟
- 调试时若遇到“undefined reference”,确认链接了正确的标准库版本
基本上就这些。std::format 让C++字符串处理变得更现代、清晰,推荐在新项目中优先使用。虽然功能还在逐步完善,但核心用法已足够稳定。










