Capisco che -D_FILE_OFFSET_BITS=64
causi il 64% di off_t
. Quindi cosa fa -D_LARGEFILE_SOURCE
che non è già stato fatto da -D_FILE_OFFSET_BITS=64
? Cosa fanno esattamente queste definizioni?Qual è la differenza tra _LARGEFILE_SOURCE e _FILE_OFFSET_BITS = 64?
risposta
glibc Feature test macros documentazione afferma:
_LARGEFILE_SOURCE
Se questa macro si definisce alcune funzioni supplementari sono disponibili che rettificare alcune carenze in tutti gli standard precedenti. In particolare, sono disponibili le funzioni fseeko e ftello. Senza queste funzioni la differenza tra l'interfaccia ISO C (fseek, ftell) e l'interfaccia POSIX di basso livello (lseek) porterebbe a problemi.Questa macro è stata introdotta come parte dell'estensione di supporto file di grandi dimensioni (LFS).
Così che la macro specifica rende fseeko
e ftello
disponibili. Le impostazioni _FILE_OFFSET_BITS
da sole non rendono disponibili queste funzioni.
(Si noti che se si sta utilizzando un dialetto GNU C, il default con GCC, potrebbe non essere necessario definire in modo esplicito _LARGEFILE_SOURCE
. Lo fai se si utilizza -std=c99
per esempio.)
L'altra risposta è sbagliato, poiché la documentazione di _LARGEFILE_SOURCE
è fuorviante. _FILE_OFFSET_BITS=64
è sufficiente per esporre le funzioni fseeko
e ftello
e così è una macro _POSIX_C_SOURCE
definita> = 200112L
.
Dalla documentazione glibc su _FILE_OFFSET_BITS
Se la macro è definito per il valore 64, l'interfaccia di file di grandi dimensioni sostituisce la vecchia interfaccia. Ad esempio, le funzioni non sono disponibili con nomi diversi (come con
_LARGEFILE64_SOURCE
). Invece i vecchi nomi di funzioni ora fanno riferimento alle nuove funzioni, ad es. Una chiamata afseeko
ora chiama effettivamentefseeko64
.
Definire sempre _FILE_OFFSET_BITS=64
per passare ai tipi a 64 bit su sistemi basati su glibc a 32 bit. glibc dovrebbe davvero renderlo predefinito ...