c++oding="utf-8" ?>
std::print和std::println是c++23最安全简洁的格式化输出方式,需包含头文件、编译器支持(gcc≥14.2等)并启用-std=c++23;前者不换行,后者自动追加\n,均使用{}占位符语法,支持file*输出,线程安全且性能优于cout和printf。

直接用 std::print 和 std::println 是目前 C++23 中最安全、最简洁的格式化输出方式,但前提是你的编译器已支持 C++23 且启用了 <print></print> 头文件——否则会编译失败,不是写法错,是环境没跟上。
如何启用 std::print / std::println(C++23 编译器配置)
这两个函数不在 <iostream></iostream> 或 <cstdio></cstdio> 里,必须显式包含 <print></print>,且需满足:GCC ≥ 14.2、Clang ≥ 18、MSVC ≥ 19.39,并开启 -std=c++23(不能用 c++20 或 c++26 代替代)。常见错误是只加了头文件却忘了改标准版本,报错类似:
error: 'print' is not a member of 'std'
解决步骤:
- 确认编译器版本(
g++ --version/clang++ --version) - 添加
#include <print></print>,删掉多余的<iostream></iostream>(除非你还用std::cin) - 编译时指定
-std=c++23,MSVC 还需加/utf-8支持 Unicode 字符串字面量 - Linux/macOS 下确保 libc++ 或 libstdc++ 已更新到匹配版本;Windows 上 MSVC 默认支持,但 MinGW-w64 需确认是否启用了实验性 C++23 支持
std::print 与 std::println 的参数差异和使用场景
std::print 不自动换行,std::println 在格式化后追加 \n。两者都支持两种重载形式:
-
std::print(fmt, args...)→ 输出到stdout -
std::print(stream, fmt, args...)→ 输出到任意std::FILE*(如stderr、fopen("log.txt", "w"))
注意:std::println 的无参重载(std::println())是 C++26 新增,C++23 中不可用;若想只打一个换行,仍得用 std::print("\n") 或 fputs("\n", stdout)。
典型误用:
std::print("Value: {}\n", x); // ❌ 多余 \n —— 本意是 println,却用了 print + 手动 \n
应改为:
std::println("Value: {}", x); // ✅ 清晰、安全、少出错
格式字符串语法与常见踩坑点
它们复用 std::format 的语法,即 {} 占位符,不支持 printf 风格的 %d。错误示例:
std::print("%d\n", 42); // ❌ 编译失败:格式字符串非法
正确写法:
std::print("{}\n", 42); // ✅ 基础占位
std::print("{:.2f}", 3.14159); // ✅ 支持 format_spec
std::print("Name: {0}, Age: {1}", name, age); // ✅ 位置索引
容易忽略的细节:
- 空字符串字面量
""不能作为fmt参数(编译期检查失败) - 宽字符字符串(
L"...")不被接受;必须用 UTF-8 编码的普通字符串字面量 - 自定义类型要支持格式化,需提供
formatter<t></t>特化,或继承std::formattable(C++23 起部分标准类型已内置支持,如std::vector、std::chrono::time_point)
性能与线程安全的实际表现
std::print 内部调用 std::vprint 并同步 stdout,因此在多线程环境下无需额外加锁;而 std::cout 若未禁用同步(<code>std::ios_base::sync_with_stdio(false)),默认是线程安全但慢,禁用后又需手动同步。
性能关键点:
- 比
std::cout快约 1.5–3×(实测小字符串场景,GCC 14.2) - 比
printf略快(尤其含复杂格式时),因省去了 va_list 解包开销 - 写入文件流(
FILE*)时绕过 iostream 缓冲层,适合日志高频写入 - 但若频繁调用(如循环内每轮一次),仍建议批量拼接后单次输出,避免重复格式化开销
真正难搞的是跨平台 Unicode 输出:Linux/macOS 默认 UTF-8 没问题;Windows 控制台默认是 GBK/UTF-16,需调用 SetConsoleOutputCP(CP_UTF8) 并确保终端字体支持,否则中文显示为乱码——这不是 std::print 的错,是运行时环境的事。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











