Für die Bearbeitung von Dateisystemen, die Dateien > 2 Gigabyte (GB) enthalten, gibt es jeweils eine 64-Bit-Variante zu den nachfolgend aufgelisteten 32-Bit-C-Bibliotheksfunktionen. Die 64-Bit-Funktionen unterscheiden sich von den korrespondierenden 32-Bit-Funktionen durch das Suffix „64“ im Namen.
creat: | creat64 |
fgetpos: | fgetpos64 |
fopen: | fopen64 |
freopen: | freopen64 |
fseek: | fseek64 |
fseeko: | fseeko64 |
fsetpos: | fsetpos64 |
ftell: | ftell64 |
ftello: | ftello64 |
lseek: | lseek64 |
open: | open64 |
tmpfile: | tmpfile64 |
32-Bit- und 64-Bit-C/C++-Bibliotheksfunktionen
Zwischen der 32-Bit-Variante einer Funktion und der zugehörigen 64-Bit-Variante besteht kein funktionaler Unterschied. Abweichungen gibt es nur hinsichtlich der Datentypen für Parameter und Rückgabewerte, falls diese einen Offset oder eine Dateiposition spezifizieren, da für die Bearbeitung von Dateien > 2 GB auch Offset- und Rückgabewerte > 2 GB möglich sein müssen. So gibt es z.B. neben dem 32-Bit-Datentyp off_t
den 64-Bit-Datentyp off64_t
.
Die Übersetzungsumgebung stellt alle expliziten 64-Bit-Funktionen und -Typen zusätzlich zu den 32-Bit-Funktionen und -Typen zur Verfügung. Damit kann ein Programm, je nach Bedarf, beide Schnittstellen verwenden.
- Die 64-Bit-Funktionen stehen nur in ANSI-Funktionalität zur Verfügung.
- Da die meisten Namen der 64-Bit-Funktionen, auf 8 Zeichen gekürzt, CRTE-weit nicht mehr eindeutig sind, müssen Sourcen, die 64-Bit-Funktionen nutzen wollen, als LLMs generiert werden.
64-Bitschnittstelle nutzen
Für die Nutzung der 64-Bit-Schnittstelle stehen Ihnen zwei Alternativen zur Verfügung, zwischen denen Sie mithilfe des Defines _FILE_OFFSET_BITS
wählen können:
64-Bit-Funktionen transparent nutzen (
_FILE_OFFSET_BITS 64
)64-Bit-Funktionen explizit aufrufen (
_FILE_OFFSET_BITS 32
)
- Das Define
_FILE_OFFSET_BITS
muss vor dem ersten Include auf eine Include-Datei gesetzt werden. - Die automatische Ersetzung durch die 64-Bit-Funktionen können Sie wahlweise via Namens-Defines oder Makro-Defines durchführen lassen.
64-Bit-Funktionen transparent nutzen (_FILE_OFFSET_BITS 64
)
Das Define _FILE_OFFSET_BITS 64
ermöglicht die transparente Nutzung der 64-Bit-Schnittstelle, da die im Source-Code notierten 32-Bit-Funktionen bei der Übersetzung automatisch durch die zugehörigen 64-Bit-Varianten ersetzt werden (Ausnahme fseek
und ftell
, siehe unten). Außerdem stellt die Übersetzungsumgebung Datentypen in der passenden Größe bereit. So ist beispielsweise der Datentyp off_t
als long long
deklariert.
Mit dem Präprozessor-Define _MAP_NAME
wählen Sie, ob die Abbildung auf die 64-Bit-Funktionen via Namens-Define-Technik oder via Makro-Define-Technik erfolgen soll.
Ein Programm kann sowohl Dateien > 2 GB als auch Dateien <= 2 GB bearbeiten. Die transparente Nutzung der 64-Bit-Funktionen ermöglicht es, dass Programme, die bisher ausschließlich für Dateien <= 2 GB vorgesehen waren, ohne Anpassungen im Source-Code auch Dateien > 2 GB bearbeiten können.
fseek
und ftell
ist die automatische Ersetzung durch fseek64
bzw. ftell64
nicht möglich. Verwenden Sie deshalb bitte die Funktionen fseeko
bzw. ftello
, wenn Sie die automatische Ersetzung wünschen.64-Bit-Funktionen explizit aufrufen
Wenn das Define _FILE_OFFSET_BITS 32
gesetzt ist oder wenn _FILE_OFFSET_BITS
nicht definiert ist, müssen Sie für die Bearbeitung von Dateien > 2 GB die 64-Bit-Varianten der oben genannten Dateibearbeitungsfunktionen verwenden:
Falls Sie versuchen, eine Datei > 2 GB mit einer 32-Bit-Variante zu bearbeiten, führt dies zum Abbruch.
Mit den 64-Bit-Varianten können Sie jedoch auch Dateien <= 2 GB bearbeiten.
_LARGEFILE64_SOURCE 1
gesetzt wird (Prototyp-Generierung und weitere Defines).