当前位置:  开发笔记 > 前端 > 正文

我该如何打印off_t和size_t等类型?

如何解决《我该如何打印off_t和size_t等类型?》经验,为你挑选了3个好方法。

我正在尝试打印类似off_tsize_t.什么是正确的占位符printf() 是可移植的

或者是否有完全不同的方式来打印这些变量?



1> Johannes Sch..:

您可以使用zsize_t和tptrdiff_t

printf("%zu %td", size, ptrdiff);

但我的manpage说,一些较旧的图书馆使用了不同的字符,z并且不鼓励使用它.然而,它是标准化的(按照C99标准).对于那些intmax_tint8_tstdint.h等等,还有你可以使用宏,像另一个回答说:

printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);

它们列在的联机帮助页中inttypes.h.

就个人而言,我只是将值转换为unsigned long或者long像另一个答案推荐.如果您使用的C99,那么你可以(而且应该,当然)转换为unsigned long longlong long并使用%llu%lld分别格式.


由于符号不匹配(C99 7.19.6.1#9),使用`%zd`和`size_t`是**未定义的行为**.一定是'%zu`.
那么,如何打印off_t呢?
@Jens我不知道带有`size_t`的`%zd`是如何从该段或任何其他段中获得未定义的行为.实际上,#7中`%z`的定义明确允许`%d`使用`size_t`和相应的签名类型,而§6.2.5#9明确允许使用无符号类型的值,其中相应的签名类型是预期的,只要该值是有符号类型的有效非负值.
off_t实际上是我系统上很长的签名。
我认为该手册页不鼓励使用libc5使用的Z(大写).它似乎不鼓励z(小写).

2> Steve Jessop..:

要打印off_t:

printf("%jd\n", (intmax_t)x);

要打印size_t:

printf("%zu\n", x);

要打印ssize_t:

printf("%zd\n", x);

请参阅C99标准中的7.19.6.1/7,或更方便的格式代码POSIX文档:

http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html

如果您的实现不支持这些格式化代码(例如,因为您使用的是C89),那么您有一些问题,因为AFAIK在C89中没有具有格式代码且保证一样大的整数类型作为这些类型.所以你需要做一些特定于实现的事情.

例如,如果您的编译器具有long long并且您的标准库支持%lld,您可以自信地期望它将代替intmax_t.但如果没有,你将不得不退回long,这将在其他一些实现上失败,因为它太小了.


到目前为止,这是一个更好的答案,我会忘记将%zu用作无符号的size_t。强制转换为intmax_t是解决任何平台上的off_t的好方法。

3> NoBrassRing..:

对于微软来说,答案是不同的.VS2013在很大程度上符合C99标准,但"不支持hh,j,z和t长度前缀." 对于size_t"即32位平台上的无符号__int32,64位平台上的无符号__int64"使用带有类型说明符o,u,x或X的前缀I(大眼). 请参阅VS2013大小规范

对于off_t,它在VC\include\sys\types.h中定义为long.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有