В чем разница между _LARGEFILE_SOURCE и _FILE_OFFSET_BITS=64?

Я понимаю, что -D_FILE_OFFSET_BITS=64 заставляет off_t быть 64-битным. Так что же делает -D_LARGEFILE_SOURCE такого, чего еще не сделал -D_FILE_OFFSET_BITS=64? Что именно делают эти определения?


person panzi    schedule 06.01.2013    source источник


Ответы (2)


GLIBC Макросы тестирования функций в документации указано:

_LARGEFILE_SOURCE
Если этот макрос определен, доступны некоторые дополнительные функции, которые исправляют некоторые недостатки во всех предыдущих стандартах. В частности, доступны функции fseeko и ftello. Без этих функций разница между интерфейсом ISO C (fseek, ftell) и низкоуровневым интерфейсом POSIX (lseek) привела бы к проблемам.

Этот макрос был представлен как часть расширения поддержки больших файлов (LFS).

Таким образом, этот макрос специально делает доступными fseeko и ftello. _FILE_OFFSET_BITS настройки сами по себе не делают эти функции доступными.

(Обратите внимание, что если вы используете диалект C GNU, используемый по умолчанию для GCC, вам может не понадобиться явно определять _LARGEFILE_SOURCE. Например, если вы используете -std=c99.)

person Mat    schedule 06.01.2013

Другой ответ неверен, так как документация для _LARGEFILE_SOURCE вводит в заблуждение. _FILE_OFFSET_BITS=64 достаточно для предоставления функций fseeko и ftello, поэтому макрос _POSIX_C_SOURCE определен как >= 200112L.

Из документации glibc на _FILE_OFFSET_BITS

Если макрос определен со значением 64, интерфейс больших файлов заменяет старый интерфейс. То есть функции не доступны под разными именами (как с _LARGEFILE64_SOURCE). Вместо этого старые имена функций теперь ссылаются на новые функции, например, вызов fseeko теперь действительно вызывает fseeko64.

Всегда определяйте _FILE_OFFSET_BITS=64 для переключения на 64-битные типы в 32-битных системах на основе glibc. glibc действительно должен сделать его по умолчанию...

person nxbit    schedule 04.03.2017