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