c++oding="utf-8" ?>
std::print编译不过的根本原因是其属于c++23“附录d:待完成特性”,截至2026年10月,gcc、clang、msvc均未完全实现,头文件为空壳,标准库无符号导出,非配置或语法问题。

std::print 为什么编译不过?
直接写 std::print("x = {}", 42); 报错,大概率是因为没开 C++23 支持,或者没包含头文件。C++23 的格式化输出不是默认启用的——它依赖 <print></print> 头文件,且必须显式启用 C++23 标准。
- g++/clang++ 需加
-std=c++23(注意不是c++2b,后者在较新版本中已弃用) - MSVC 需
/std:c++23,且要求 VS 2022 17.5+(早期 17.4 仅部分支持) - 必须
#include <print></print>;<iostream></iostream>或<format></format>不能替代 - 不支持宽字符重载(即没有
std::wprint),std::print只处理窄字符串和 UTF-8 编码的char序列
std::print 和 std::println 有什么区别?
核心差异就一条:换行。前者不自动换行,后者末尾强制加 \n。其余行为完全一致——都支持 {} 占位符、类型自动推导、对齐/精度等格式说明符,底层共用 std::format 引擎。
-
std::print("Hello");输出Hello后光标停在行尾,不换行 -
std::println("Hello");等价于std::print("Hello\n"); - 两者都支持输出到指定 stream:
std::print(std::cerr, "error: {}"); - 如果需要输出到文件或 stringstream,得用
std::format_to+std::osyncstream组合,std::print不接受自定义 buffer
格式说明符怎么写?和 printf 或 Python f-string 一样吗?
语法继承自 std::format,和 Python 的 str.format() 更接近,不是 printf 风格。不支持 %d,但支持 {:d}、{:.2f}、{: 这类显式格式规范。
-
std::println("{:X}", 255);→FF(十六进制大写) -
std::println("{:.3f}", 3.14159);→3.142(保留三位小数) -
std::println("{:>8}", "hi");→hi(右对齐,总宽 8) - 不支持运行时宽度/精度(如
{:*),参数必须是编译期常量或通过 <code>std::format预先构造 - 枚举、自定义类型需提供
formatter特化才能用{}直接格式化,否则编译失败
为什么输出中文乱码或崩溃?
根本原因是终端编码和字符串编码不匹配。C++23 的 std::print 假设所有 char 字符串都是 UTF-8 编码,并原样输出字节流——它不做任何编码转换。
- Windows 控制台默认是 GBK/GB2312,直接输出 UTF-8 中文会显示乱码;需先调用
SetConsoleOutputCP(CP_UTF8)(Windows API)或改用std::osyncstream+std::cout配合std::locale - Linux/macOS 一般默认 UTF-8,但若终端 locale 是
C或POSIX,也可能出问题;检查locale命令输出,确保LANG包含UTF-8 - 不要传入含嵌入空字符
\0的字符串——std::print会将其视为 C 风格字符串结束,导致截断或未定义行为 - 避免在多线程中无保护地混用
std::print和std::cout,它们不共享内部锁;高并发场景优先用std::osyncstream{std::cout}包裹
真正麻烦的从来不是语法,而是编码环境和标准库实现进度——哪怕编译器声称支持 C++23,<print></print> 在 libstdc++(GCC)、libc++(Clang)和 MSVC STL 中的完成度仍有差异,建议实际使用前先跑个 std::println("✅"); 验证终端是否真能显示。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











