是否可以便携式确定 Python 中 off_t 的适当映射以用于 ctypes?

ter*_*rse 5 python ctypes posix

背景:POSIX 定义的 off_t数据类型是一个大小可变的有符号整数,具体取决于环境。对于 64 位构建环境,它似乎始终是 64 位 off_t。对于 32 位系统,off_t 的大小取决于环境(通常由 _FILE_OFFSET_BITS 和相关控制)。

我正在使用 Python 的ctypes来访问使用off_t数据类型的。 ctypes的不具有一个类型off_t通过如此映射这样的API结构或另有所指选择,一些其他类型由下式定义的ctypes,即一个c_intc_int32c_int64c_longc_longlong

在四处寻找其他人的解决方案时,我见过各种各样的解决方案,其中大多数是猜测并仅限于其中一种环境,其中一些完全错误(使用无符号类型),而且没有一个是可移植的。

是否有一种健壮的、可移植的方法来确定off_t给定 Python 解释器的构建大小?

谢谢!

agh*_*ast 2

标准中不支持这一点,正如您自己指出的那样,它会根据用于编译库的标志(不是 Python)在 32 位机器上有所不同。(也就是说,您需要知道您正在使用的库例程是否使用 -D_FILE_OFFSET_BITS=64 进行编译...)

GCC 的定义似乎off_t相当long int一致。所以这可能是“最安全”的选择。或者您可以默认使用 64 位。无论哪种情况,覆盖行为并指定位数的选项可能都很有价值。

是否有一个可以调用的函数会返回一个off_t?也许您可以用 0xFF 填充缓冲区,然后seek(0)看看ftell()写入了多少个零?