正确的size_t:%zu或%Iu的printf格式说明符?

Pat*_*ick 41 c c++ printf visual-studio-2010 format-specifiers

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

根据帖子

平台无关size_t c中的格式说明符?

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

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

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

微软是否不遵守这些标准?或者自C99以来标准是否已更改?或者C和C++之间的标准是不同的(这对我来说似乎很奇怪)?

Ori*_*rds 18

Microsoft文档 说明:

hh,j,z,和t长度前缀不被支持.

因此%zu不受支持.

报告还指出,正确的前缀用于size_tI-所以你会使用%Iu.

  • VS 2015支持``%z`` (12认同)

Ale*_*nze 15

微软的C编译器没有赶上最新的C标准.它基本上是一个C89编译器,带有一些来自C99的精选功能(例如long long).因此,不应该支持某些内容(%zuC99中出现).

  • MSVC 过去一直专注于 C++ 一致性,而不是 C,尽管这种情况正在发生变化。由于 C99 标准库通过引用添加到 C++11 标准库中,CRT 工作早在 [VS 2013](https://devblogs.microsoft.com/cppblog/c99-library-support-in-visual-工作室-2013/)。``z`` 直到 VS 2015 才添加。另一个主要问题是 C99 预处理器被声明为 C++ 标准的一部分,因此这项工作一直在进行中,并将在 [VS 2019 16.6](https ://devblogs.microsoft.com/cppblog/announcing-full-support-for-acc-conformant-preprocessor-in-msvc/)。 (4认同)

Pav*_*l P 12

MS Visual Studio之前不支持%zuprintf说明符VS2013.从VS2013开始(例如_MSC_VER> = 1800)%zu可用.

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

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

  • 如果你的目标是 C++,我会优先使用 static_cast 而不是 C 风格的强制转换。它的主要优点是在编译时进行检查。 (2认同)

Yuu*_*shi 6

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

  • VS2013不支持`%zu`,只支持`%Iu`.不能代表2015年. (4认同)
  • @LarsViklund:您可能想要在C模式下重新检查.MSVC++ 2015在C++模式下不支持它们,这是正确的.但是`%zu`是另一回事,因为C++ 11选择了C99**库**的变化.`%zu`现在必须在任一模式下工作. (4认同)
  • VS 2015支持C99.2013年和2015年都支持`%zu`. (3认同)
  • @john:参见http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/.从版本1.0开始,它们的编译器称为Visual C++,与DOS时代的"Microsoft C/C++编译器"形成对比. (2认同)