【问题标题】:Why doesn't %zd printf format work in VS2010?为什么 %zd printf 格式在 VS2010 中不起作用?
【发布时间】:2011-10-03 01:56:39
【问题描述】:

以下我的代码不会在 Visual Studio 中打印值。

int main() { 
    intptr_t P = 10;
    printf("test value is %zd",P);
    return 0;
}

输出:

test value is zd

我希望上面的代码打印出来

test value is 10

我使用 intptr_t 而不是整数,以便使代码在 32 位和 64 位架构中都进行调整。

【问题讨论】:

  • 请使用一致的缩进样式。它将帮助我们和您阅读您的代码。
  • @bdonlan 和 Bart,感谢您的建议,我对一切感到抱歉:)

标签: c visual-studio visual-studio-2010


【解决方案1】:

z 前缀未在 Microsoft 的 printf 版本中定义。我认为I 前缀可能会起作用。见http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx

【讨论】:

    【解决方案2】:

    尽管 C99 支持 z 长度说明符,但 Visual Studio 2010 不支持 C99,而是符合缺少 z 长度说明符的旧版 C。作为一个扩展,VS2010 确实支持I length specifier 而不是size_t,但这不能移植到其他平台。

    我建议使用 unsigned long long%llu 说明符代替;开销极小,而且还可以移植到 C99 平台。

    【讨论】:

    • MS 文档不允许%llu 作为选项,仅允许%lld。而且您还想将参数转换为适当的大小。
    • @Mark Ransom 也想将 uintptr_t 用于无符号整数。在这种情况下,您对我有什么建议?
    【解决方案3】:

    对于可移植代码,#include <inttypes.h> 并在您的 printf 格式字符串中使用 PRIdPTR

    printf("test value is %" PRIdPTR, P);
    

    Wikipedia page for inttypes.h 有一个指向该文件版本的链接,该版本可以与 Visual C++ 一起使用,并且可能也可以与 VS2010 一起使用(如果 Microsoft 没有添加 inttypes.h)。

    PRIdPTR 用于intptr_tPRIuPTR 用于uintptr_t

    【讨论】:

    【解决方案4】:

    从 VS 2013 开始,Visual C++ 不支持 %z。如果您希望将来的版本支持它,请对此错误投票:

    https://connect.microsoft.com/VisualStudio/feedback/details/806338/vc-printf-and-scanf-should-support-z

    【讨论】:

    • 我相信在 VS 2015 中添加了对此的支持。
    【解决方案5】:

    要打印 size_t,您需要在 VS 中使用 %Iu,在 gcc 中使用 %zu

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多