【问题标题】:How to print 'off_t' in C? [duplicate]如何在 C 中打印“off_t”? [复制]
【发布时间】:2011-03-09 20:20:10
【问题描述】:

可能重复:
How should I print types like off_t and size_t?

我正在使用 fstat(stream, &fs) 来获取 C 中的文件大小,它返回类型 off_t

打印这个只是给出一个警告:

format ‘%d’ expects type ‘int’, but argument has type ‘off_t’

任何想法如何在没有编译器错误的情况下打印?

【问题讨论】:

  • 也许stackoverflow.com/questions/1401526/…这个问题有帮助
  • @Matteo Italia 不,虽然这在标题中,但答案中没有任何内容可以确认如何打印 off_t
  • 这是一个合并候选,因为副本上的答案并不是很清楚和完整。尽管在撰写本文时,我认为以下答案也不完全正确。
  • @Steve Jessop:问题在于,在很大程度上,没有真正好的答案。在最后一个 C89 编译器死去之前,也不会有。
  • @Jerry:如果需要 C89,则为真,但 IMO 对 C89 的答案与不合格 C 的答案是分开的,对我来说,这意味着“C 已过时不到 10 年”。 off_t 无论如何都是 POSIX-y,C89+POSIX 是比单独的 C89 更罕见的组合,因为它排除了显而易见的情况。如果这确实是关于 C89 的真相,我会称一个答案说:“这是在 C99 中执行此操作的方法 - 在 C89 中无法便携地执行此操作”。为了获得额外的奖励,它也可以说明如何在 Windows 上执行此操作。

标签: c printf


【解决方案1】:

偏移类型通常是长整数。投射并相应地打印。

off_t 下面的实际类型在 sys/types.h 中定义。你可以查一下!

【讨论】:

  • 请记住,这是不可移植的; off_t 在不同的系统上可能是不同的类型!
  • POSIX 定义 off_t 是有符号的 (pubs.opengroup.org/onlinepubs/007908799/xsh/systypes.h.html),尽管将其转换为足够大的无符号类型不会造成任何伤害,只要读取输出的人对它们有了解即可。跨度>
  • 意思是“长”,而不是无符号。固定的!谢谢。
  • 会在几分钟内接受这个:)
  • 在支持大文件的 32 位系统上,它很可能是 long long 而不仅仅是 long。正如您所说,对于非便携式解决方案,您只需检查 sys/types.h 并为您的实现中实际使用的任何内容使用正确的格式。
【解决方案2】:

找到答案,使用:

%lld

无需任何转换即可工作。

【讨论】:

  • 我不会使用它,因为它是long long int 的说明符,并且不能保证off_t 属于该类型。您应该转换并使用适当的说明符。
  • +1 对 Matteo 的评论。铸造是要走的路。
  • 如果不强制转换,可能会损坏后面的参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2018-11-01
  • 2013-07-20
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多