问题 _LARGEFILE_SOURCE和_FILE_OFFSET_BITS = 64有什么区别?


我明白那个 -D_FILE_OFFSET_BITS=64 原因 off_t 为64位。那是什么呢 -D_LARGEFILE_SOURCE 做到这一点还没有完成 -D_FILE_OFFSET_BITS=64?这些定义究竟做了什么?


4814
2018-01-06 16:15


起源



答案:


GLIBC 功能测试宏 文件说明:

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

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

所以宏特别制作 fseeko 和 ftello 可用。 _FILE_OFFSET_BITS 单独设置不会使这些功能可用。

(请注意,如果您使用的是C语言的GNU方言,默认情况下使用GCC,则可能不需要明确定义 _LARGEFILE_SOURCE。如果你使用,你会这样做 -std=c99 例如。)


8
2018-01-06 16:25





另一个答案是错误的,作为文档 _LARGEFILE_SOURCE 是误导。 _FILE_OFFSET_BITS=64 足以揭露 fseeko 和 ftello 功能,等等 _POSIX_C_SOURCE 宏定义为> = 200112L

从glibc文档上 _FILE_OFFSET_BITS

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

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


3
2018-03-04 14:20