В чем разница между _LARGEFILE_SOURCE и _FILE_OFFSET_BITS = 64?
Я понимаю, что -D_FILE_OFFSET_BITS=64
вызывает off_t
как 64 бит. Итак, что делает -D_LARGEFILE_SOURCE
, что еще не сделано с помощью -D_FILE_OFFSET_BITS=64
? Что конкретно делают эти определения?
Ответы
Ответ 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 должен действительно сделать его по умолчанию...