【问题标题】:Correct printf format specifier for size_t: %zu or %Iu?size_t 的正确 printf 格式说明符:%zu 还是 %Iu?
【发布时间】:2013-03-14 15:41:18
【问题描述】:

我想使用 Microsoft Visual Studio 2010 在 C++ 中使用 printf 打印出 size_t 变量的值(我想在这段特定的代码中使用 printf 而不是 <<,所以请不要答案告诉我我应该改用<<)。

根据帖子

Platform independent size_t Format specifiers in c?

正确的平台无关方式是使用%zu,但这在Visual Studio 中似乎不起作用。 Visual Studio 文档位于

http://msdn.microsoft.com/en-us/library/vstudio/tcxf1dw6.aspx

告诉我必须使用%Iu(使用大写的i,而不是小写的l)。

微软没有遵循这里的标准吗?还是自 C99 以来标准已更改?还是 C 和 C++ 的标准不同(我觉得很奇怪)?

【问题讨论】:

  • 您链接到的 MSDN 页面上写着 The I, I32, and I64 length modifier prefixes are Microsoft extensions and are not ANSI-compatible,这似乎回答了您关于 MS 遵循标准的问题。

标签: c++ c visual-studio-2010 printf format-specifiers


【解决方案1】:

MS Visual Studio 在VS2013 之前不支持%zu printf 说明符。从VS2013开始(例如_MSC_VER>=1800%zuis available

作为替代方案,对于以前版本的 Visual Studio,如果您要打印较小的值(例如 std 容器中的元素数量),您可以简单地转换为 int 并使用 %d

printf("count: %d\n", (int)str.size()); // less digital ink spent
// or:
printf("count: %u\n", (unsigned)str.size());

【讨论】:

【解决方案2】:

Microsoft 的 C 编译器没有赶上最新的 C 标准。它基本上是一个 C89 编译器,具有 C99 中的一些精选特性(例如 long long)。因此,不支持某些内容也就不足为奇了(%zu 出现在 C99 中)。

【讨论】:

  • MSVC 过去一直专注于 C++ 一致性,而不是 C,尽管这种情况正在发生变化。由于 C99 标准库通过引用添加到 C++11 标准库中,因此 CRT 工作从 VS 2013 开始。 z 直到 VS 2015 才添加。另一个主要问题是 C99 预处理器被声明为 C++ 标准的一部分,因此这项工作一直在进行中,并将在 VS 2019 16.6 中完成。
【解决方案3】:

The Microsoft documentation 状态:

不支持hhjzt 长度前缀。

因此不支持%zu

它还指出size_t 使用的正确前缀是I——所以你应该使用%Iu

【讨论】:

  • VS 2015 支持%z
  • @ChuckWalbourn 当前链接的时间戳是 2017 年的,它说不支持 %z。后续版本中是否删除了 z 支持?
  • %zu 绝对适用于 VS 2015。请参阅 Microsoft Docs。您的链接是很久未维护的旧 MSDN 文档。
【解决方案4】:

根据here 的回答,%z 是 C99 的补充。由于 MSVC 不支持任何后来的 C 标准,因此不支持 %z 也就不足为奇了。

【讨论】:

  • @john:参见例如herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99。从 1.0 版开始,他们的编译器被称为 Visual C++,与他们的 DOS 时代的“Microsoft C/C++ 编译器”形成鲜明对比。
  • VS 2015 支持 C99。 2013 和 2015 都支持%zu
  • VS2013 不支持%zu,只支持%Iu。不能为 2015 年说话。
  • @JustinM.Keyes 2015 不支持“C99”。他们喜欢假装他们有足够的库支持来构建像 ffmpeg 这样的东西,但他们肯定不会说实际的语言。改天试试指定的初始化器。
  • @LarsViklund:您可能需要在 C 模式下重新检查。 MSVC++ 2015 在 C++ 模式下不支持它们,这是正确的。但是%zu 是另一回事,因为 C++11 接受了 C99 library 的更改。 %zu 现在必须在任一模式下工作。
猜你喜欢
  • 2017-05-06
  • 2011-03-11
  • 2021-10-24
  • 2011-05-14
  • 2017-11-16
  • 2013-06-22
  • 2013-06-22
  • 2012-05-17
相关资源
最近更新 更多