我知道这-D_FILE_OFFSET_BITS=64
会导致off_t
64 位。那么-D_LARGEFILE_SOURCE
,尚未完成的工作是-D_FILE_OFFSET_BITS=64
什么?这些定义究竟做了什么?
2 回答
GLIBC功能测试宏文档指出:
_LARGEFILE_SOURCE
如果定义了此宏,则可以使用一些额外的功能来纠正所有先前标准中的一些缺点。具体来说,函数 fseeko 和 ftello 可用。如果没有这些函数,ISO C 接口(fseek、ftell)和低级 POSIX 接口(lseek)之间的差异将导致问题。此宏是作为大文件支持扩展 (LFS) 的一部分引入的。
因此,该宏专门制作fseeko
并ftello
可用。_FILE_OFFSET_BITS
单独的设置不能使这些功能可用。
(请注意,如果您使用的是 C 的 GNU 方言(GCC 的默认方言),您可能不需要显式定义_LARGEFILE_SOURCE
。-std=c99
例如,如果您使用的话,您可以这样做。)
另一个答案是错误的,因为文档_LARGEFILE_SOURCE
具有误导性。_FILE_OFFSET_BITS=64
足以公开fseeko
andftello
函数,_POSIX_C_SOURCE
定义为 >= 的宏也是如此200112L
。
来自 glibc 文档_FILE_OFFSET_BITS
如果宏定义为值 64,则大文件接口替换旧接口。即,这些函数不能以不同的名称提供(因为它们是
_LARGEFILE64_SOURCE
)。相反,旧函数名称现在引用新函数,例如,调用fseeko
now 确实调用fseeko64
。
始终定义_FILE_OFFSET_BITS=64
为在 32 位基于 glibc 的系统上切换到 64 位类型。glibc 真的应该让它成为默认值......