GCC是否支持C++20的std::format?

69

17
在C++20采用fmtlib之前,C++没有任何适当的输出格式化方式。fmtlib拥有唯一可用的API,并且显然是最快的格式化程序。fmtlib不仅仅是“另一种格式化输出的方式”,它是C++中唯一可行的格式化输出方式。 - Konrad Rudolph
@bipll 我已经阅读了那份文档,但是没有找到任何有用的信息。也没有关于“文本格式”的内容。 - PorssiMies
@PorssiMies 确实还没有实现,但你可以找到一些替代实现,可能已经足够好了,例如 - Luke Skywalker
6
我非常想知道他们为什么需要这么长时间。本质上,那个库早就被写成一个独立的项目了。 - shuhalo
@Konrad Rudolph std::printf 在角落里哭泣... - 0xB00B
显示剩余6条评论
5个回答

90

7
请注意,{fmt}比C++20的<format>库拥有更多的功能。因此,如果您打算使用它,将fmt::format一对一地替换为std::format时,您需要仔细选择要使用哪些功能。 - Paul Deitel
10
我很喜欢这个网站一直保持更新。 - Alex
1
gcc的主干最近实现了文本格式化。 - Desmond Gold
1
有趣。无论是gcc还是clang都找不到格式包含。我已经安装了最新的clang-17和我系统上能获取到的最新gcc,即版本12.1.0。 我是不是做错了什么?因为每个人都在高兴地说"哇,我们有了新功能",而显然我没有。 - FalcoGer
@FalcoGer 使用clang时,你还需要使用llvm的libc++库,-stdlib=libc++应该可以解决问题。至于GCC,你需要至少版本13。 - 0xB00B

43
编辑:自GCC 13起,支持format。对于想要查找编译器对其他库或功能的支持的人,请参考cppreference.com上的编译器支持链接。

gcc是否支持C++20的std::format

还没有!

目前还没有编译器支持,甚至连gcc 11也没有。请参阅库特性中的文本格式化

C++20库特性的编译器支持


2
它可在Visual Studio 2019(16.10)中使用。 - PFee
1
@PFee 正确,但GCC目前还不支持它。我希望更新的GCC 11或12版本能够支持它。 - John Park
1
它不在GCC 11中(已经是openSUSE Tumbleweed的默认编译器),如果能够获得有关GCC / libstdc ++进展的更新,那将是非常好的。 - PFee
1
在gcc 11.2.1中仍不可用。 - Eric Sokolowsky

22
截至2022年11月15日,GCC 12.2不支持此功能。准确来说,它的标准库实现不支持它(因为它是一个库特性,而不是编译器特性)。
注意:这个特性被提及为在GCC 13.0中实现 (链接)。
目前可以尝试使用Clang 14.0.0及以上版本,但需要注意以下内容:
Clang 14.0.0libc++中,添加了对std::format的支持,但是:"该文件已经实现,但仍标记为不完整的特性。尚未实现的LWG问题将导致API和ABI的破坏" (链接)。
Clang 15.0.0及更高版本的libc++中,可以通过使用-fexperimental-library编译器标志启用此功能 (链接)。
您还可以尝试使用MSVC 16.10及更高版本。支持std::format的实现被提及为完整。
可以在这里查看标准库的当前状态:

1
我使用clang17,即使加上-fexperimental-library标志,它仍然无法编译,并抱怨找不到#include <print>#include <format>。你能详细说明如何使其工作吗? - FalcoGer
@FalcoGer 你是否使用了 -stdlib=libc++?这里有一个例子:https://godbolt.org/z/K5ee4b9r4 - Ihor Baklykov
如果我使用那个,它会抱怨找不到iostream。 - FalcoGer
但是-fexperimental-library只能与-stdlib=libc++一起使用,因为据我所知,Clang默认使用的是GCC的stdlibc++,你必须手动指示它使用Clang的libc++。"如果我使用它,它会抱怨找不到iostream。" - 检查是否安装了libc++。 - Ihor Baklykov
结果发现discord对libc++-14有依赖问题。安装libc++17-dev并使用-L将clang指向libc++experimental库解决了这个问题。对我来说,discord现在是一个flatpak应用程序。 - FalcoGer

6

GCC 13 新增了 std::format 支持。根据 cppreference,从 GCC 13 开始,其 C++20 支持(包括核心语言和标准库)将不再存在缺陷。

这个 bugzilla ticket 指出一些 C++23 对 std::format 的扩展尚未实现。

GCC 13 预计将在 2023 年 4 月左右发布。

compiler explorer 上的 GCC trunk 安装包含 std::format 支持。

截至 2023 年 3 月 19 日,OpenSUSE Tumbleweed 和即将推出的 Fedora 38 均包括 GCC 13。


这个在最新的clang版本中不可用吗?我只看到它在clang trunk上工作。现在它可以与gcc 13及更高版本一起使用。 - nullspace
没错,clang 17将支持C++20的std::format。https://en.cppreference.com/w/cpp/compiler_support/20 - undefined

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接