2

我注意到一些 C 项目编译的代码使用_FILE_OFFSET_BITS=64. 现在,在我的系统(64 位)上,添加或删除它似乎并没有多大作用 - 但也许在其他系统上它确实如此。

我应该什么时候使用_FILE_OFFSET_BITS=64(或任何其他价值)?或者,或者,我需要检查什么以确保我实际上不需要它?

4

2 回答 2

3

是的,一定要定义它。

-D_FILE_OFFSET_BITS=64在 64 位平台上使用没有缺点。在 32 位平台上,如果您正在做的事情可能需要在偏移量超过 2³¹ 的文件上查找/告知任何内容,您需要这个或准备使用单独的64 位函数。

该行为不是默认行为的原因是 C 标准和 POSIX 指定long int用于各种功能 - 在 32 位 Unixen 上, long int通常只能容纳高达 2³¹ 的值。现在,使用-D_FILE_OFFSET_BITS=64将保证使用 等的代码lseekftello继续在 32 位系统中工作,就像在 64 位系统中一样。

引用 GLibc 功能测试宏:

宏:_FILE_OFFSET_BITS

此宏确定应使用哪个文件系统接口,一个替换另一个。而_LARGEFILE64_SOURCE将 64 位接口作为附加接口提供,_FILE_OFFSET_BITS则允许 64 位接口替换旧接口。

[...]

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

仅当系统提供处理大文件的机制时才应选择此宏。在 64 位系统上,此宏无效,因为其*64功能与普通功能相同。

fseeko(3)手册页:

在某些架构上,两者off_t都是long32 位类型,但_FILE_OFFSET_BITS使用值 64 定义(在包含任何头文件之前)将变成off_t64 位类型。

于 2018-01-06T13:23:22.840 回答
0

Autoconf 为此提供了一个宏:AC_SYS_LARGEFILE. off_t它通过在配置时默认检测是否已经是 64 位类型来添加所需的选项,如果不是,是否设置_FILE_OFFSET_BITS64将其转换为 64 位类型。它还检测另一个预处理器宏 ,_LARGE_FILES以相同的方式用于某些非 GNU 系统(根据评论为“AIX 风格的主机”)。

如果你使用 autoconf,你可以直接使用这个宏。如果你不使用它,你可以重新实现这个相同的逻辑。

这些宏位于保留的名称空间中,供实现使用,因此最好不要将它们设置在不像 GNU 那样使用它们的系统上。它们可能会对其他系统产生意想不到的影响。虽然我怀疑没有恶意实现会在定义这些宏时故意破坏,但某些实现,可能是未来的实现,可以巧合地合法地使用具有这些相同名称的宏,用于微妙的不同目的。

于 2018-01-06T13:28:30.083 回答