c - 如何在ANSI C(C89)中使用printf打印size_t和ptrdiff_t

标签 c printf c89

我知道这在SO上已经被质疑了很多次,但是我的问题是特定于ANSI C(C89)的。

在C99中,存在子规范zt,ANSI C不支持这些子规范。

如何使用p说明符?

最佳答案

size_t是实现定义的无符号整数类型。 ptrdiff_t是实现定义的带符号整数类型。

在C89 / C90中(通常,但严格来讲讲是不正确的,称为“ANSI C”),这些类型没有特殊的格式说明符。但是,最广泛的整数类型是long intunsigned 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 longlong,但是int对于快速而又肮脏的代码来说还可以。

如何使用p说明符?

不,%p仅适用于void*类型的指针,在任何情况下,输出格式都是实现定义的(通常为十六进制,但我见过其他表示形式)。

关于c - 如何在ANSI C(C89)中使用printf打印size_t和ptrdiff_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44230789/

相关文章:

c - undefined reference 'shm_open' ,已在此处添加 -lrt 标志

c - 如何使用 vim 对一行描述进行注释?

go - %g 中具有宽度和精度字段的 fmt.Printf 行为异常

matlab - 在matlab中从结构创建表 - 对齐

c - 哪个版本的C更适合学生学习——C89/90还是C99?

C编程: Stackoverflow is a cause of abrupt termination

c - 如果我的程序通过 CTRL-C 终止,为什么使用 fprintf 输出的字符串最终没有写入输出文件?

C - 在尝试逐行读取文件并且行可能包含空格字符后进入死循环?

c++ - 不支持 VARIADIC 的宏自动注入(inject)参数

c - C 中 struct malloc 的问题