_LARGEFILE_SOURCE和_FILE_OFFSET_BITS = 64有什么区别?

pan*_*nzi 12 c linux linux-from-scratch

我明白-D_FILE_OFFSET_BITS=64原因off_t是64位.那么-D_LARGEFILE_SOURCE这项工作尚未完成-D_FILE_OFFSET_BITS=64呢?这些定义究竟做了什么?

Mat*_*Mat 9

GLIBC 功能测试宏文档说明:

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

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

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

(请注意,如果您使用的是C语言的GNU方言,默认情况下使用GCC,则可能不需要显式定义_LARGEFILE_SOURCE.-std=c99例如,如果您使用,则执行此操作.)


小智 8

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

从 glibc 文档中 _FILE_OFFSET_BITS

如果宏定义为值 64,则大文件接口将替换旧接口。即,函数不能以不同的名称使用(就像它们一样_LARGEFILE64_SOURCE)。相反,旧函数名称现在引用新函数,例如,对fseekonow的调用确实会调用fseeko64

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