我注意到一些 C 项目编译的代码使用_FILE_OFFSET_BITS=64
. 现在,在我的系统(64 位)上,添加或删除它似乎并没有多大作用 - 但也许在其他系统上它确实如此。
我应该什么时候使用_FILE_OFFSET_BITS=64
(或任何其他价值)?或者,或者,我需要检查什么以确保我实际上不需要它?
我注意到一些 C 项目编译的代码使用_FILE_OFFSET_BITS=64
. 现在,在我的系统(64 位)上,添加或删除它似乎并没有多大作用 - 但也许在其他系统上它确实如此。
我应该什么时候使用_FILE_OFFSET_BITS=64
(或任何其他价值)?或者,或者,我需要检查什么以确保我实际上不需要它?
-D_FILE_OFFSET_BITS=64
在 64 位平台上使用没有缺点。在 32 位平台上,如果您正在做的事情可能需要在偏移量超过 2³¹ 的文件上查找/告知任何内容,您需要这个或准备使用单独的64 位函数。
该行为不是默认行为的原因是 C 标准和 POSIX 指定long int
用于各种功能 - 在 32 位 Unixen 上, long int
通常只能容纳高达 2³¹ 的值。现在,使用-D_FILE_OFFSET_BITS=64
将保证使用 等的代码lseek
将ftello
继续在 32 位系统中工作,就像在 64 位系统中一样。
引用 GLibc 功能测试宏:
宏:
_FILE_OFFSET_BITS
此宏确定应使用哪个文件系统接口,一个替换另一个。而
_LARGEFILE64_SOURCE
将 64 位接口作为附加接口提供,_FILE_OFFSET_BITS
则允许 64 位接口替换旧接口。[...]
如果宏定义为值 64,则大文件接口替换旧接口。即,这些函数不能以不同的名称提供(因为它们是
_LARGEFILE64_SOURCE
)。相反,旧函数名称现在引用新函数,例如,对 fseeko 的调用现在确实调用 fseeko64。仅当系统提供处理大文件的机制时才应选择此宏。在 64 位系统上,此宏无效,因为其
*64
功能与普通功能相同。
和fseeko(3)
手册页:
在某些架构上,两者
off_t
都是long
32 位类型,但_FILE_OFFSET_BITS
使用值 64 定义(在包含任何头文件之前)将变成off_t
64 位类型。
Autoconf 为此提供了一个宏:AC_SYS_LARGEFILE
. off_t
它通过在配置时默认检测是否已经是 64 位类型来添加所需的选项,如果不是,是否设置_FILE_OFFSET_BITS
为64
将其转换为 64 位类型。它还检测另一个预处理器宏 ,_LARGE_FILES
以相同的方式用于某些非 GNU 系统(根据评论为“AIX 风格的主机”)。
如果你使用 autoconf,你可以直接使用这个宏。如果你不使用它,你可以重新实现这个相同的逻辑。
这些宏位于保留的名称空间中,供实现使用,因此最好不要将它们设置在不像 GNU 那样使用它们的系统上。它们可能会对其他系统产生意想不到的影响。虽然我怀疑没有恶意实现会在定义这些宏时故意破坏,但某些实现,可能是未来的实现,可以巧合地合法地使用具有这些相同名称的宏,用于微妙的不同目的。