为什么在VS2010中无法使用%zd printf格式?

9

以下是我的代码片段,在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
@bdonlan和Bart,感谢你们的建议,我为一切感到抱歉 :) - thetna
5个回答

4

4
尽管C99支持z长度说明符,但Visual Studio 2010不支持C99,而是符合较早版本的C,该版本缺少z长度说明符。作为扩展,VS2010支持I长度说明符用于size_t,但这在其他平台上不可移植。
我建议改用%llu说明符的unsigned long long;开销很小,也适用于C99平台。

1
MS文档不允许使用%llu选项,只能使用%lld。而且你需要将参数转换为正确的大小。 - Mark Ransom
@Mark Ransom想要使用uintptr_t作为无符号整数,你对我有什么建议? - thetna
https://dev59.com/o2kw5IYBdhLWcg3w1eG7 - Ciro Santilli OurBigBook.com

2

为了编写可移植的代码,在你的 printf 格式字符串中,需要使用 PRIdPTR ,并且引入 #include <inttypes.h> 头文件。

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

inttypes.h维基页面有一个链接,可以下载适用于Visual C++的文件版本,这个版本也可能适用于VS2010(如果Microsoft没有添加inttypes.h的话)。

PRIdPTR代表intptr_tPRIuPTR代表uintptr_t


1
由于VS2012中仍然没有inttypes.h,这里是Tom提到的当前实现的链接,现在放在code.google.com上 - Rick Berge

1

我相信这个功能已经被添加到了VS 2015中。 - Bruce Dawson

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

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