17

我知道这-D_FILE_OFFSET_BITS=64会导致off_t64 位。那么-D_LARGEFILE_SOURCE,尚未完成的工作是-D_FILE_OFFSET_BITS=64什么?这些定义究竟做了什么?

4

2 回答 2

10

GLIBC功能测试宏文档指出:

_LARGEFILE_SOURCE
如果定义了此宏,则可以使用一些额外的功能来纠正所有先前标准中的一些缺点。具体来说,函数 fseeko 和 ftello 可用。如果没有这些函数,ISO C 接口(fseek、ftell)和低级 POSIX 接口(lseek)之间的差异将导致问题。

此宏是作为大文件支持扩展 (LFS) 的一部分引入的。

因此,该宏专门制作fseekoftello可用。_FILE_OFFSET_BITS单独的设置不能使这些功能可用。

(请注意,如果您使用的是 C 的 GNU 方言(GCC 的默认方言),您可能不需要显式定义_LARGEFILE_SOURCE-std=c99例如,如果您使用的话,您可以这样做。)

于 2013-01-06T16:25:37.510 回答
8

另一个答案是错误的,因为文档_LARGEFILE_SOURCE具有误导性。_FILE_OFFSET_BITS=64足以公开fseekoandftello函数,_POSIX_C_SOURCE定义为 >= 的宏也是如此200112L

来自 glibc 文档_FILE_OFFSET_BITS

如果宏定义为值 64,则大文件接口替换旧接口。即,这些函数不能以不同的名称提供(因为它们是_LARGEFILE64_SOURCE)。相反,旧函数名称现在引用新函数,例如,调用fseekonow 确实调用fseeko64

始终定义_FILE_OFFSET_BITS=64为在 32 位基于 glibc 的系统上切换到 64 位类型。glibc 真的应该让它成为默认值......

于 2017-03-04T14:20:42.793 回答