0

0

C++中的std::print(C++23)是什么?(如何替代繁琐的cout和printf)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-10 12:53:57

|

805人浏览过

|

来源于php中文网

原创

std::print 是 C++23 引入的类型安全格式化输出函数,但截至 2024 年中主流编译器尚未默认支持:GCC 13 不支持,Clang 18 需手动开启 -std=c++2b 且 libc++ 实现未完成,MSVC 2022 17.8+ 仅部分支持。

c++中的std::print(c++23)是什么?(如何替代繁琐的cout和printf)

std::print 是什么,现在能用吗

std::print 是 C++23 引入的格式化输出函数,目标是替代 std::cout 的链式拼接和 printf 的类型不安全。但它不是“开箱即用”的——目前(截至 2024 年中)主流编译器尚未默认启用:GCC 13 默认不支持,Clang 18 需手动开启 -std=c++2b 且依赖 libc++ 实现未完成,MSVC 2022 17.8+ 仅部分支持(需 /std:c++23 + 启用预览特性)。实际项目中直接依赖 std::print 很可能编译失败。

为什么不能直接用 printf 或 cout 替代它

printf 安全隐患明确:printf("%s", nullptr) 崩溃、参数类型错位无编译期检查;std::cout 则是另一类麻烦:操作符重载导致模板推导复杂、流状态(如 std::hex)易污染后续输出、性能上每次 std::print 设计为零状态、类型安全、一次解析格式串——但前提是你的标准库实现了它。当前更现实的选择是:

  • 短期:用 fmt::printfmt 库),API 几乎与 std::print 一致,C++17 起可用,已被 GCC/Clang/MSVC 广泛集成
  • 过渡期:若必须用标准库,可封装一层 std::ostringstream + std::format(C++20),再输出到 std::cout,但多一次字符串拷贝

怎么写一个临时替代 std::print 的宏或函数

如果不想引入第三方库,又想快速获得类似体验,可以基于 std::format(C++20)手写一个轻量封装:

#include 
#include 

template void print(std::string_view fmt, Args&&... args) { std::cout << std::vformat(fmt, std::make_format_args(args...)); }

注意几个坑:

Hika AI
Hika AI

Hika AI是一个免费的AI智能搜索引擎

下载

立即学习C++免费学习笔记(深入)”;

  • std::format 不支持 %d 这类 C 风格占位符,必须用 {}{0}{1}
  • std::vformat 抛异常(std::format_error)当格式串非法,线上代码建议加 try/catch
  • std::make_format_args 要求所有参数可被格式化(比如裸指针不行,得转 static_cast(p)
  • 没有 std::printstd::print(stderr, ...) 变体,如需重定向得自己传流对象

std::print 和 fmt::print 的行为差异有哪些

虽然 fmt::print 是事实上的 std::print 参考实现,但仍有细节差别:

  • fmt::print 支持编译期格式串检查(fmt::print(FMT_STRING("x = {}"), 42)),std::print 标准未强制要求
  • fmt::print 默认启用颜色、对齐等扩展功能;std::print 严格按标准只做基础格式化
  • Windows 上 fmt::print 自动处理换行符(\n\r\n),std::print 不处理,依赖底层流
  • fmt::print 可直接格式化 std::filesystem::path 等自定义类型(通过特化 fmt::formatter),std::print 仅支持标准库定义的格式化类型

真正要用上 std::print,得盯住 libc++ 和 libstdc++ 的实现进度,而不是只看编译器版本号。现在写 demo 可以玩,进生产还得掂量下工具链成熟度。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

191

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

11

2026.02.03

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

864

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

442

2024.06.27

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

76

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

464

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

1

2026.02.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 16.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号