__USE_FILE_OFFSET64 против _FILE_OFFSET_BITS = 64

20

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

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

    
задан vy32 05.12.2010 в 06:45
источник

2 ответа

12

Есть значения 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) в источниках autoconf.

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

    
ответ дан Sergey Vlasov 31.07.2011 в 10:14
5

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

    
ответ дан pushkarnk 06.10.2014 в 13:54
  • Кстати, определенный тест не имеет смысла в приведенном выше коде libc. Если _FILE_OFFSET_BITS == 64 успешно, то макрос должен быть определен; как еще он расширился до 64? Если макрос не определен, то _FILE_OFFSET_BITS будет расширяться до 0, и тест завершится с ошибкой. –  Kaz 04.12.2015 в 02:39
  • @Kaz Определенный тест состоит в том, чтобы избежать предупреждений из режима gcc -Wundef, который используется при создании самого libc, поскольку glibc имеет много внутренних макросов конфигурации, и они хотят избежать опечаток. Поскольку это сама сборка libc, заголовки не получают обычного исключения из предупреждений, которые gcc применяет к «системным заголовкам». –  zwol 18.08.2016 в 20:49