__USE_FILE_OFFSET64 против _FILE_OFFSET_BITS = 64 - PullRequest
22 голосов
/ 05 декабря 2010

Я пытаюсь поддерживать код, который компилируется на множестве разных систем. Я видел дюжину разных способов запроса lseek, который занимает 64 бита. Некоторые системы используют lseek64, некоторые используют lseeko, некоторые требуют, чтобы вы определили _FILE_OFFSET_BITS=64, и теперь я только что нашел новую, которая требует, чтобы вы определили __USE_FILE_OFFSET64.

Есть ли какой-нибудь стандарт для всего этого?

Ответы [ 2 ]

14 голосов
/ 31 июля 2011

В IEEE Std 1003.1-2004 есть значения getconf (и более новый набор в IEEE Std 1003.1-2008 ; см. Также раздел ПРИМЕРЫ в этих документах).Фактические параметры компилятора (которые могут даже не быть определены) не указаны.

Однако макрос AC_SYS_LARGEFILE в autoconf не пытается использовать это - он просто пытается -n32 для IRIX, -D_FILE_OFFSET_BITS=64 (который должен работать для большинства систем) и -D_LARGE_FILES=1 (по-видимому, для AIX).Также есть ссылка на Добавление поддержки произвольных размеров файлов к единой спецификации UNIX (более старый черновик спецификации, который затем был частично включен в спецификацию POSIX.1) в источниках autoconf.

Что касается определения __USE_FILE_OFFSET64 вручную, не уверен, что это действительно правильное решение - макросы с двойным подчеркиванием зарезервированы для системных заголовков, и, скорее всего, там есть какое-то условное определение, которое зависит от других определений.

6 голосов
/ 06 октября 2014

В features.h вы видите соотношение между _FILE_OFFSET_BITS и __USE_FILE_OFFSET64.

#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
# define __USE_FILE_OFFSET64    1
#endif

Итак, только _FILE_OFFSET_BITS предназначено для пользователей.

...