I understand that -D_FILE_OFFSET_BITS=64
causes off_t
to be 64bits. So what does -D_LARGEFILE_SOURCE
do that isn't already done by -D_FILE_OFFSET_BITS=64
? What do these definitions do exactly?
The GLIBC Feature test macros documentation states:
_LARGEFILE_SOURCE
If this macro is defined some extra functions are available which rectify a few shortcomings in all previous standards. Specifically, the functions fseeko and ftello are available. Without these functions the difference between the ISO C interface (fseek, ftell) and the low-level POSIX interface (lseek) would lead to problems.This macro was introduced as part of the Large File Support extension (LFS).
So that macro specifically makes fseeko
and ftello
available. _FILE_OFFSET_BITS
settings alone don't make these functions available.
(Note that if you're using a GNU dialect of C, the default with GCC, you might not need to explicitly define _LARGEFILE_SOURCE
. You do if you use -std=c99
for instance.)
The other answer is wrong, as the documentation for _LARGEFILE_SOURCE
is misleading. _FILE_OFFSET_BITS=64
is sufficient to expose the fseeko
and ftello
functions, and so is a _POSIX_C_SOURCE
macro defined to >= 200112L
.
From the glibc documentation on _FILE_OFFSET_BITS
If the macro is defined to the value 64, the large file interface replaces the old interface. I.e., the functions are not made available under different names (as they are with
_LARGEFILE64_SOURCE
). Instead the old function names now reference the new functions, e.g., a call tofseeko
now indeed callsfseeko64
.
Always define _FILE_OFFSET_BITS=64
to switch over to the 64-bit types on 32-bit glibc-based systems. glibc should really make it the default...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With