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

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

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

4b9b3361

Ответ 1

GLIBC Документация по функциям в макросах:

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

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

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

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

Ответ 2

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

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

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

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