Подтвердить что ты не робот

__USE_FILE_OFFSET64 против _FILE_OFFSET_BITS = 64

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

В 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 предназначен для пользователей.