如何在C语言中打印'off_t'?

5
可能重复:
如何打印off_t和size_t这样的类型? 我在C中使用fstat(stream, &fs)来获取文件大小,它返回类型off_t。仅仅打印这个会产生警告:
format ‘%d’ expects type ‘int’, but argument has type ‘off_t’

有什么办法可以在没有编译器错误的情况下打印这个内容吗?

这是一个合并候选项,因为重复的答案并不清晰完整。尽管在撰写本文时,我认为下面的答案也并非完全正确。 - Steve Jessop
@Steve Jessop:问题在于,在很大程度上,实际上并没有真正好的答案。在最后一个 C89 编译器消失之前,也不会有真正好的答案。 - Jerry Coffin
@Igor K:有一个建议是进行强制类型转换,这是唯一可行的C(89?)替代方案。 - Matteo Italia
@Matteo:但是转换成什么类型,这才是问题。我认为在C89中没有整数类型具有格式代码并保证至少与POSIX off_t一样大的大小。 - Steve Jessop
实际上,即使在C99中,我认为它们也是无用且令人困惑的,但原因是几乎不可能找到正确使用它们且固定大小数组不起作用的情况,而不是因为我认为它们会使嵌入式程序员感到困惑。我是在询问后者... - Steve Jessop
显示剩余15条评论
2个回答

6

偏移量类型通常是长整型。进行转换,并相应地打印。

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


2
请记住,这不是可移植的;在不同的系统上,off_t 可能是不同的类型! - Lars Noschinski
2
POSIX 规定 off_t 是带符号的(http://pubs.opengroup.org/onlinepubs/007908799/xsh/systypes.h.html),但将其转换为足够大的无符号类型不会有任何害处,只要读取输出的人有头脑即可。 - Steve Jessop
本意是“long”,而不是“unsigned”。已修复!谢谢。 - salezica
在支持大文件的32位系统上,它可能是long long而不仅仅是long。正如您所说,对于非可移植解决方案,您可以检查sys/types.h并针对实际实现使用正确的格式。 - Steve Jessop

0

找到答案了,使用:

%lld

无需任何强制转换即可运行。


15
我不会使用它,因为它是 "long long int" 的说明符,而不能保证 "off_t" 是该类型。你应该进行强制类型转换,并使用适当的说明符。 - Matteo Italia
2
支持Matteo的评论。强制类型转换是正确的方法。 - salezica
3
如果你不投掷,后面的参数可能会出现错误。 - Chris Lutz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接