_LARGEFILE_SOURCE和_FILE_OFFSET_BITS = 64有什么区别?

我知道-D_FILE_OFFSET_BITS=64会导致off_t-D_FILE_OFFSET_BITS=64 。 那么-D_LARGEFILE_SOURCE做了什么,那还没有做-D_FILE_OFFSET_BITS=64呢? 这些定义究竟做了什么?

Solutions Collecting From Web of "_LARGEFILE_SOURCE和_FILE_OFFSET_BITS = 64有什么区别?"

GLIBC 功能测试宏文档指出:

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

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

所以这个宏特别使fseekoftello可用。 单独的_FILE_OFFSET_BITS设置不能使这些功能可用。

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

另一个答案是错误的,因为_LARGEFILE_SOURCE的文档是误导性的。 _FILE_OFFSET_BITS=64足以暴露fseekoftello函数,并且定义为> = 200112L_POSIX_C_SOURCE200112L

_FILE_OFFSET_BITS的glibc文档

如果宏被定义为值64,则大文件接口替换旧接口。 也就是说,这些函数不能在不同的名字下使用(就像_LARGEFILE64_SOURCE )。 相反,旧的函数名现在引用新的函数,例如,现在调用fseeko确实调用fseeko64

总是定义_FILE_OFFSET_BITS=64来切换到基于32位glibc的系统上的64位类型。 glibc应该真的使它成为默认…