我知道这在SO上已经被质疑了很多次,但是我的问题是特定于ANSI C(C89)的。
在C99中,存在子规范z
和t
,ANSI C不支持这些子规范。
如何使用p
说明符?
最佳答案
size_t
是实现定义的无符号整数类型。 ptrdiff_t
是实现定义的带符号整数类型。
在C89 / C90中(通常,但严格来讲讲是不正确的,称为“ANSI C”),这些类型没有特殊的格式说明符。但是,最广泛的整数类型是long int
和unsigned long int
,它们当然具有自己的格式说明符。
要打印size_t
值,请将其转换为unsigned long
并使用"%lu"
。
要打印ptrdiff_t
值,请将其转换为long
并使用"%ld"
。
请注意,如果您的代码随后使用C99或C11编译器进行编译,则size_t
和/或ptrdiff_t
可能会比long
宽,并且代码可能会失败。 (据我所知,64位Windows界面具有32位long
,因此实际上可能是一个问题。)
在C99和更高版本中,只需将%zu
用作size_t
,将%td
用作ptrdiff_t
。如果您想让代码真正具有可移植性,请考虑使用#if
来测试__STDC_VERSION__
的值。
如果您的编译器仅部分符合C99或C11,则还可能会遇到问题。您可能有一个不完全支持C99的编译器,但确实提供了long long
。但是出于打印size_t
值的目的,仅当您要打印的值实际超过ULONG_MAX
时才是一个问题,该值至少为232-1。对于ptrdiff_t
值,只要不超过long
(至少231-1),就可以将其转换为LONG_MAX
。
最后,如果您碰巧知道要打印的值不太大,则可以放弃转换为int
并使用%d
。我建议强制转换为unsigned long
或long
,但是int
对于快速而又肮脏的代码来说还可以。
如何使用p
说明符?
不,%p
仅适用于void*
类型的指针,在任何情况下,输出格式都是实现定义的(通常为十六进制,但我见过其他表示形式)。
关于c - 如何在ANSI C(C89)中使用printf打印size_t和ptrdiff_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44230789/