为什么%zd printf格式在VS2010中不起作用?

时间:2011-07-11 19:31:33

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

以下代码不会在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位架构中调整代码。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

对于便携式代码,#include <inttypes.h>并使用PRIdPTR格式字符串中的printf

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

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

PRIdPTR适用于intptr_tPRIuPTR适用于uintptr_t

答案 3 :(得分:1)

Visual C ++,自VS 2013起,不支持%z。如果您希望将来的版本支持它,那么就这个错误投票:

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

答案 4 :(得分:0)

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