我应该如何打印像off_t和size_t这样的类型?
-
06-09-2019 - |
题
我正在尝试打印类似的类型 off_t
和 size_t
. 。正确的占位符是什么 printf()
那是便携式的?
或者是否有完全不同的方式来打印这些变量?
解决方案
可以使用z
用于为size_t和t
为ptrdiff_t的像
printf("%zu %td", size, ptrdiff);
但我的联机帮助说一些老图书馆使用不同的性格比z
和鼓励使用它。不过,它的标准化(由C99标准)。对于那些intmax_t
和int8_t
的stdint.h
等等,还有你可以使用宏,像另一个回答说:
printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);
它们列在inttypes.h
的手册页。
个人而言,我只投值以unsigned long
或long
像另一个答案建议。如果使用C99,然后就可以(也应该当然)转换为unsigned long long
或long long
和分别使用%llu
或%lld
格式。
其他提示
要打印off_t
:
printf("%jd\n", (intmax_t)x);
要打印size_t
:
printf("%zu\n", x);
要打印ssize_t
:
printf("%zd\n", x);
请参阅7.19.6.1/7在C99标准,或格式代码的更方便的POSIX文档:
http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html一>
如果您实现不支持的格式代码(例如,因为你是在C89),那么你有一个有点问题的,因为据我所知有没有整数类型C89具有格式代码,并保证那样大,因为这些类型。所以,你需要做的实施,一些具体的事情。
例如,如果你的编译器已经long long
和你的标准库支持%lld
,你可以自信地预计将在地方intmax_t
的服务。但如果不是这样,你就必须退回到long
,这将在一些其他具体实施失败,因为它太小了。
对于微软来说,答案是不同的。VS2013在很大程度上符合C99,但“不支持HH,J,Z和T长度前缀。”对于size_t”,即32位平台上的未签名__int32,在64位平台上未签名的__Int64”使用前缀i(Capital Eye),带有类型o,u,u,x或x。 参见VS2013尺寸规格
至于off_t,在VC\include\sys ypes.h中定义为long。
哪个版本的C您使用?
在C90,标准的做法是投射到符号或无符号长,酌情和打印相应。我已经看到了为size_t%Z,但哈比森和斯蒂尔没有在printf()提到它,并在任何情况下,不会帮助你ptrdiff_t的或什么。
在C99中,各_t类型来用自己的printf宏,所以像"Size is " FOO " bytes."
我不知道细节,但是这是一个相当大的数字格式的一部分包含文件。
您会想从inttypes.h使用格式宏。
请参阅此问题:跨平台格式字符串变量键入的size_t?
综观man 3 printf
在Linux,OS X,和OpenBSD为%z
为size_t
和%t
为ptrdiff_t
所有节目支持(C99),但没有提及的那些的off_t
。在野外的建议通常提供开%u
的off_t
转换,这是“足够正确的”,只要能告诉我(二者unsigned int
和off_t
64位和32位系统之间变化相同)。
我看到这个帖子至少两次,因为公认的答案是很难remeber对我来说(我很少用z
或j
旗帜和他们好像不是的平台独立的)。
href="https://stackoverflow.com/a/2550799/1691873">标准从来没有明确说size_t
确切的数据长度size_t您的平台,然后选择其中的一种:
if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64
和我建议使用stdint
类型,而不是原始数据类型相合。
我记得,唯一的可移植的方式去做,是投结果为“unsigned long int类型”,并使用%lu
。
printf("sizeof(int) = %lu", (unsigned long) sizeof(int));
使用 “%ZO” 为off_t。 (八进制) 或 “%つ” 为小数。