feature_test_macros - Feature-Test-Makros
Mit Feature-Test-Makros kann der Programmierer steuern, welche
Definitionen aus System-Header-Dateien bei der Kompilierung eines Programms
verwendet werden.
HINWEIS: Um wirksam zu sein, muss die Definition
eines Feature-Test-Makros im Quelltext vor den #include-Anweisungen
für die Header-Dateien stehen. Dies kann entweder im
Kompilierbefehl (cc -DMACRO=value) oder durch die Definition
des Makros innerhalb des Quellcodes vor dem Einlesen aller Header erreicht
werden. Die Anforderung, dass das Makro definiert sein muss, bevor es in
irgendwelche Header-Dateien eingebunden wird, existiert, da sich
Header-Dateien ohne Einschränkungen gegenseitig einbinden
dürfen. Daher kann beispielsweise in den nachfolgenden Zeilen die
Definition des Makros _GNU_SOURCE keine Wirkung haben, da der Header
<abc.h> selbst <xyz.h> einbindet (POSIX erlaubt
dies explizit):
#include <abc.h>
#define _GNU_SOURCE
#include <xyz.h>
Einige Feature-Test-Makros helfen bei der Erstellung von portablen
Anwendungen, indem sie die Verwendung nicht standardgemäßer
Definitionen verhindern. Andere Makros können verwendet werden, um
gezielt nicht standardisierte Definitionen, die sonst per Voreinstellung
nicht verwendet werden, zu verwenden.
Die genauen Auswirkungen jedes der im Folgenden beschriebenen
Feature-Test-Makros können Sie durch Auswertung der Header-Datei
<features.h> ermitteln. Anmerkung: Applikationen
müssen <features.h> nicht direkt einbinden; es
ist im Gegenteil sogar unerwünscht. Siehe ANMERKUNGEN.
Wenn eine Funktion die Definition eines Feature-Test-Makros
erfordert, enthält die ÜBERSICHT einer Handbuchseit in der
Regel einen Vermerk der folgenden Form (dieses Beispiel finden Sie in der
Handbuchseite von acct(2)):
#include <unistd.h>
int acct(const char *filename);
acct(): _BSD_SOURCE || (_XOPEN_SOURCE &&
_XOPEN_SOURCE < 500)
Das || bedeutet, dass zwecks Ermittlung der Deklaration von
acct(2) aus <unistd.h> eine der beiden folgenden
Makro-Definitionen vor dem Einfügen jeglicher Header-Dateien erfolgen
muss:
#define _BSD_SOURCE
#define _XOPEN_SOURCE /* oder jeder Wert < 500 */
Alternativ können gleichwertige Definitionen in den
Kompilierbefehl eingebettet werden:
cc -D_BSD_SOURCE
cc -D_XOPEN_SOURCE # Oder jeder Wert < 500
Beachten Sie, dass einige Feature-Test-Makros
standardmäßig definiert sind. Daher ist es nicht
immer erforderlich, die in der ÜBERSICHT angegebenen
Feature-Test-Makro(s) explizit anzugeben.
In wenigen Fällen verwenden Handbuchseiten eine
Abkürzung für die Anforderungen der Feature-Test-Makros
(dieses Beispiel stammt aus readahead(2)):
#define _GNU_SOURCE
#include <fcntl.h>
ssize_t readahead(int fd, off64_t *offset, size_t count);
Dieses Format wird immer dann angewendet, wenn nur ein einziges
Feature-Test-Makro die Verwendung der Funktions-Deklaration
ermöglicht und das Makro nicht standardmäßig definiert
wird.
In den Absätzen weiter unten wird erläutert, wie
Feature-Test-Makros in Linux-Glibc 2.x,
x > 0, behandelt werden.
Zuerst eine Zusammenfassung einiger Details für den
Ungeduldigen:
- In modernem Quellcode müssen Sie höchstwahrscheinlich
_POSIX_C_SOURCE (für Definitionen aus verschiedenen
Versionen von POSIX.1), _XOPEN_SOURCE (für Definitionen aus
verschiedenen Versionen von SUS), _GNU_SOURCE (für GNU-
und/oder Linux-spezifischem Zeug) und _DEFAULT_SOURCE (für
normalerweise standardmäßig bereitgestellte Definitionen)
verwenden.
- Bestimmte Makros sind mit Vorgabewerten definiert. Daher mag es nicht
notwendig sein, sie explizit zu definieren, obwohl eine oder mehrere
Makros in der ÜBERSICHT einer Handbuchseite als benötigt
markiert sind. Die vollständigen Details der Vorgaben sind
später in dieser Handbuchseite dargestellt.
- Die Definition von _XOPEN_SOURCE mit einem Wert von 600 oder mehr
bewirkt den gleichen Effekt wie die Definition von _POSIX_C_SOURCE
mit einem Wert von 200112L oder größer. Hierbei kann
-
_POSIX_C_SOURCE >= 200112L
- in den Feature-Test-Makro-Anforderungen in der ÜBERSICHT einer
Handbuchseite ist implizit angenommen, dass das Folgende den gleichen
Effekt hat:
-
_XOPEN_SOURCE >= 600
- *
- Die Definition von _XOPEN_SOURCE mit einem Wert von 700 oder mehr
bewirkt den gleichen Effekt wie die Definition von _POSIX_C_SOURCE
mit einem Wert von 200809L oder größer. Hierbei kann
-
_POSIX_C_SOURCE >= 200809L
- in den Feature-Test-Makro-Anforderungen in der ÜBERSICHT einer
Handbuchseite ist implizit angenommen, dass das Folgende den gleichen
Effekt hat:
-
_XOPEN_SOURCE >= 700
Die Linux-Glibc »versteht« die folgenden
Feature-Test-Makros:
- __STRICT_ANSI__
- ISO Standard C. Dieses Makro wird impliziert definiert, wenn gcc(1)
beispielsweise mit den Schaltern -std=c99 oder -ansi
aufgerufen wird.
- _POSIX_C_SOURCE
- Mit der Definition dieses Makros stellen Header-Dateien Definitionen wie
folgt bereit:
- Der Wert 1 aktiviert Definitionen gemäß POSIX.1-1990 und ISO
C (1990).
- Ein Wert gleich oder größer als 2 aktiviert
zusätzlich Definitionen gemäß POSIX.2-1992.
- Der Wert 199309L oder größer aktiviert Definitionen
gemäß POSIX.1b (Echtzeiterweiterungen).
- Der Wert 199506L oder größer aktiviert Definitionen
gemäß POSIX.1c (Threads).
- (Seit Glibc 2.3.3) Der Wert 200112L oder größer aktiviert
zusätzlich Definitionen gemäß der POSIX.1-2001 Base
Specification (ohne die XSI-Erweiterung). Dieser Wert führt auch
zur Aktivierung von C95- (seit Glibc 2.12) und C99 (seit Glibc 2.10)
Funktionalitäten (mit anderen Worten, dies ist äquivalent
zur Definition von _ISOC99_SOURCE).
- (Seit Glibc 2.10) Der Wert 200809L oder größer aktiviert
zusätzlich Definitionen gemäß der POSIX.1-2008 Base
Specification (ohne die XSI-Erweiterung).
- _POSIX_SOURCE
- Die Definition dieses überholten Makros mit einem beliebigen Wert
hat die gleiche Wirkung wie die Definition von _POSIX_C_SOURCE mit
dem Wert 1.
- Da dieses Makro veraltet ist, ist es im Allgemeinen nicht dokumentiert,
wenn Feature-Test-Makro-Anforderungen in Handbuchseiten beschrieben
werden.
- _XOPEN_SOURCE
- Mit der Definition dieses Makros stellen Header-Dateien Definitionen wie
folgt bereit:
- Die Zuweisung eines beliebigen Wertes aktiviert Definitionen nach POSIX.1,
POSIX.2 und XPG4.
- Der Wert 500 oder größer aktiviert zusätzlich die
Definitionen für SUSv2 (UNIX 98).
- (Seit Glibc 2.2) Der Wert 600 oder größer aktiviert
zusätzlich Definitionen für SUSv3 (UNIX 03, also die
POSIX.1-2001 Base Specification und die XSI-Erweiterung) sowie
C99-Definitionen.
- (Seit Glibc 2.10) Der Wert 700 oder größer aktiviert
zusätzlich Definitionen für SUSv4 (d.h. die POSIX.1-2001
Base Specification und die XSI-Erweiterung).
- Falls __STRICT_ANSI__ nicht definiert ist oder _XOPEN_SOURCE
mit einem Wert identisch zu oder größer als 500 und
weder _POSIX_SOURCE noch _POSIX_C_SOURCE explizit definiert
sind dann werden die folgenden Makros implizit definiert:
- _POSIX_SOURCE wird auf den Wert 1 gesetzt.
- _POSIX_C_SOURCE wird definiert, entsprechend des Wertes von
_XOPEN_SOURCE:
- _XOPEN_SOURCE < 500
- _POSIX_SOURCE wird auf den Wert 2 gesetzt.
- 500 <= _XOPEN_SOURCE < 600
- _POSIX_SOURCE wird auf den Wert 199506L gesetzt.
- 600 <= _XOPEN_SOURCE < 700
- _POSIX_SOURCE wird auf den Wert 200112L gesetzt.
- 700 <= _XOPEN_SOURCE (seit Glibc 2.10)
- _POSIX_SOURCE wird auf den Wert 200809L gesetzt.
- Zusätzlich bewirkt die Definition von _XOPEN_SOURCE mit
einem Wert von 500 oder mehr den gleichen Effekt wie die Definition von
_XOPEN_SOURCE_EXTENDED.
- _XOPEN_SOURCE_EXTENDED
- Wenn dieses Makro und _XOPEN_SOURCE definiert sind, dann
werden Definitionen entsprechend den XPG4v2- (SUSv1-)UNIX-Erweiterungen
(UNIX 95) aktiviert. Wird _XOPEN_SOURCE mit einem Wert von 500 oder
mehr definiert, ist der Effekt identisch zur Definition von
_XOPEN_SOURCE_EXTENDED. Der Einsatz von
_XOPEN_SOURCE_EXTENDED in neuem Quellcode sollte vermieden
werden.
- Da die Definition von _XOPEN_SOURCE mit einem Wert von 500 oder
mehr den gleichen Effekt wie die Definition von
_XOPEN_SOURCE_EXTENDED hat, wird das letztere (veraltete) Makro im
Allgemeinen in der ÜBERSICHT in Handbuchseiten nicht
beschrieben.
- _ISOC99_SOURCE (seit Glibc 2.1.3)
- Aktiviert Deklarationen, die mit dem ISO-C99-Standard konsistent
sind.
- Frühere Glibc 2.1.x-Versionen verarbeiteten ein gleichwertiges
Makro _ISOC9X_SOURCE (weil der C99-Standard noch nicht fertig war).
Obwohl die Verwendung dieses Makros obsolet ist, wird es von der Glibc
weiter zwecks Abwärtskompatibilität unterstützt.
- Die Definition von _ISOC99_SOURCE aktiviert auch ISO C (1990)
Anhang 1-Definitionen (»C95«). (Die hauptsächliche
Änderung in C95 war die Unterstützung für
internationale Zeichensätze.)
- Der Aufruf des C-Compilers mit der Option -std=c99 bewirkt den
gleichen Effekt wir die Definition dieses Makros.
- _ISOC11_SOURCE (seit Glibc 2.16)
- Aktiviert Deklarationen, die mit dem ISO-C11-Standard konsistent sind. Die
Definition dieses Makros aktiviert auch C99- und
C95-Funktionalitäten (wie _ISOC99_SOURCE).
- Der Aufruf des C-Compilers mit der Option -std=c11 bewirkt den
gleichen Effekt wie die Definition dieses Makros.
- _LARGEFILE64_SOURCE
- Aktiviert Definitionen für das durch LFS (Large File Summit)
definierte alternative API als
»Übergangserweiterungen« zu der »Single UNIX
Specification«. (Siehe
http://opengroup.org/platform/lfs.html.)
Das alternative API besteht aus einer Reihe von neuen Objekten (d.h.
Funktionen und Typen), deren Namen mit »64« endet (z. B.
off64_t versus off_t, lseek64() versus
lseek(), usw.). Neue Programme sollten dieses Makro nicht
verwenden, sondern _FILE_OFFSET_BITS=64 einsetzen.
- _LARGEFILE_SOURCE
- Dieses Makro wurde traditionell verwandt, um bestimmte Funktionen
(insbesondere fseeko(3) und ftello(3)) bereitzustellen, die
sich um Beschränkungen älterer APIs (fseek(3) und
ftell(3)) kümmerten, die long für
Datei-Offsets verwandten. Dieses Makro ist implizit definiert, falls
_XOPEN_SOURCE mit einem Wert gleich oder größer als
500 definiert ist. Neue Programme sollten dieses Makro nicht einsetzen; um
das gleiche Ergebnis zu erhalten, ist der empfohlene Mechanismus,
_XOPEN_SOURCE wie gerade beschrieben oder _FILE_OFFSET_BITS
mit einem Wert von 64 zu definieren.
- _FILE_OFFSET_BITS
- Wird diesem Makro der Wert 64 zugewiesen, werden automatisch Verweise auf
32-Bit-Funktionen und -Datentypen für Datei-Ein/Ausgabe und
Dateisystem-Operationen in Verweise auf ihre 64-Bit-Pendants konvertiert.
Dies ist für die Ein-/Ausgabe in und aus großen Dateien
(> 2 Gigabyte) auf 32-Bit-Systemen nützlich. (Mit der Definition
dieses Makros können korrekt geschriebene Programme nach einer
einfachen Neukompilierung große Dateien bearbeiten.)
- 64-Bit-Systeme erlauben natürlich Dateigrößen
größer als 2 Gigabyte. Auf diesen Systemen dieses Makro hat
keine Wirkung.
- _BSD_SOURCE (misbilligt seit Glibc 2.20)
- Mit der Definition dieses Makros mit irgend einem Wert stellen
Header-Dateien BSD-abgeleitete Definitionen bereit.
- In Glibc bis einschließlich 2.18 bewirkte die Definition dieses
Makros auch, dass BSD-Definitionen in manchen Situationen vorgezogen
werden, wenn sich Standards widersprechen. Sind aber eines oder mehrere
Makros aus der Gruppe _SVID_SOURCE, _POSIX_SOURCE,
_POSIX_C_SOURCE, _XOPEN_SOURCE,
_XOPEN_SOURCE_EXTENDED oder _GNU_SOURCE definiert, werden
BSD-Definitionen missachtet. Seit Glibc 2.19 führt
_BSD_SOURCE nicht mehr dazu, dass BSD-Definitionen im Konfliktfall
bevorzugt werden.
- Seit Glibc 2.20 wird dieses Makro misbilligt. Es hat jetzt den gleichen
Effekt wie die Definition von _DEFAULT_SOURCE, erzeugt aber eine
Compiler-Warnung (außer _DEFAULT_SOURCE ist auch definiert).
Verwenden Sie stattdessen _DEFAULT_SOURCE. Um Code zu erlauben, der
bis Glibc 2.19 _BSD_SOURCE und _DEFAULT_SOURCE ab Glibc 2.20
benötigt, um ohne Warnung übersetzt zu werden, definieren
Sie sowohl _BSD_SOURCE als auch _DEFAULT_SOURCE.
- _SVID_SOURCE (misbilligt seit Glibc 2.20)
- Die Definition dieses Makros mit einem beliebigen Wert veranlasst
Header-Dateien zur Aktivierung von von System V abgeleiteten Definitionen.
(SVID steht für System V Interface Definition; siehe
standards(7).)
- Dieses Makro wird in der gleichen Art wie _BSD_SOURCE seit Glibc
2.20 misbilligt.
- _DEFAULT_SOURCE (seit Glibc 2.19)
- Dieses Makro kann definiert werden, um sicherzustellen, dass die
»Standarddefinitionen« bereitgestellt werden, selbst wenn
die Vorgaben ansonsten deaktiviert würden. Dies passiert
beispielsweise, wenn individuelle Makros explizit definiert sind oder der
Compiler in einem seiner »Standardmodi« aufgerufen wird
(z.B. cc -std=c99).
- Die »Standard«-Definition umfasst die von POSIX.1-2008 und
C99 umfassten sowie verschiedene ursprünglich aus BDS und System V
abgeleitete Definitionen. Bis Glibc 2.19 waren diese Standardwerte
ungefähr zu der folgenden, expliziten Definition identisch:
-
cc -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809
- _ATFILE_SOURCE (seit Glibc 2.4)
- Die Definition dieses Makros mit einem beliebigen Wert veranlasst
Header-Dateien zur Aktivierung einer Auswahl von Funktion mit der Endung
»at«, siehe openat(2). Seit Glibc 2.10 wird dieses
Makro auch implizit definiert, wenn _POSIX_C_SOURCE mit einem Wert
größer oder gleich 200809L definiert ist.
- _GNU_SOURCE
- Die Definition dieses Makros (mit einem beliebigen Wert) definiert
implizit _ATFILE_SOURCE, _LARGEFILE64_SOURCE,
_ISOC99_SOURCE, _XOPEN_SOURCE_EXTENDED,
_POSIX_SOURCE, _POSIX_C_SOURCE mit dem Wert 200809L (200112L
in Glibc-Versionen vor 2.10; 199506L in Glibc-Versionen vor 2.5; 199309L
in Glibc-Versionen vor 2.1) und _XOPEN_SOURCE mit dem Wert 700 (600
in Glibc-Versionen vor 2.10; 500 in Glibc-Versionen vor 2.2).
Darüber hinaus werden verschiedene GNU-spezifische Erweiterungen
aktiviert.
- Seit Glibc 2.19 hat die Definition von _GNU_SOURCE auch den Effekt,
_DEFAULT_SOURCE implizit zu definieren. In Glibc-Versionen vor 2.20
hatte die Definition von _GNU_SOURCE auch den Effekt,
_BSD_SOURCE und _SVID_SOURCE implizit zu definieren.
- _REENTRANT
- Historisch war es bei verschiedenen C-Bibliotheken notwendig, dieses Makro
in allem Code, der multithreaded ist, zu definieren. (Einige
C-Bibliotheken könnten dies noch immer benötigen). Unter
Glibc legte dieses Makro auch Definitionen von bestimmten,
wiedereintrittsfähigen Funktionen offen.
- Allerdings ist Glibc standardmäßig seit vielen Jahren
Thread-sicher (seit Glibc 2.3). Der einzige Effekt der Definition von
_REENTRANT war, dass sie auch eine oder zwei der gleichen
Deklarationen aktivierte, die auch durch die Definition von
_POSIX_C_SOURCE mit einem Wert von 199606L oder höher
aktiviert werden.
- _REENTRANT ist jetzt veraltet. Seit Glibc 2.25 ist die Definition
von _REENTRANT äquivalent zur Definition von
_POSIX_C_SOURCE mit dem Wert 199606L. Falls durch eine andere
Methode eine höhere Konformitätsstufe (wie
_POSIX_C_SOURCE selbst, _XOPEN_SOURCE,
_DEFAULT_SOURCE oder _GNU_SOURCE) ausgewählt wird,
hat die Definition von _REENTRANT keinen Effekt.
- Dieses Makro wird automatisch definiert, falls mit
cc -pthread kompiliert wird.
- _THREAD_SAFE
- Synonym für das (veraltete) _REENTRANT; wird für die
Kompatibilität mit einigen anderen Implementierungen
bereitgestellt.
- _FORTIFY_SOURCE (seit Glibc 2.3.4)
- Die Definition dieses Makros führt dazu, dass ein paar
leichtgewichtige Prüfungen durchgeführt werden, um einige
Pufferüberlauffehler beim Einsatz verschiedener Zeichenketten- und
Speicherveränderungsfunktionen (beispielsweise bei
memcpy(3), memset(3), stpcpy(3), strcpy(3),
strncpy(3), strcat(3), strncat(3), sprintf(3),
snprintf(3), vsprintf(3), vsnprintf(3),
gets(3) und deren Weitzeichenvarianten) zu erkennen. Bei einigen
Funktionen wird die Konsistenz der Argumente geprüft,
beispielsweise dass bei open(2) ein Argument mode
übergeben wurde, wenn die angegebenen Schalter O_CREAT
enthalten. Es werden nicht alle Probleme sondern lediglich einige
häufige Fälle erkannt.
- Ist der Wert von _FORTIFY_SOURCE gleich 1 und die
Compiler-Optimierungsstufe 1 (gcc -O1) oder höher,
erfolgt eine Beschränkung auf Kontrollen, die das Verhalten
standardkonformer Programme nicht ändern sollten. Wird
_FORTIFY_SOURCE auf 2 gesetzt, werden ein paar Kontrollen
hinzugefügt, die aber Fehler in einigen standardkonformen
Programmen bewirken könnten.
- Einige der Prüfungen können bei der Kompilierung
ausgeführt werden (mittels in Header-Dateien implementierter
Makrologik) und führen zu Compiler-Warnungen, andere Kontrollen
finden zur Laufzeit statt und führen zu einem Laufzeitfehler, wenn
die Überprüfung fehlschlägt.
- Die Verwendung dieses Makros benötigt die Unterstützung
durch den Compiler. Diese ist in gcc(1) seit Version 4.0
verfügbar.
Ohne explizit definierte Feature-Test-Makros werden
standardmäßig die folgenden Feature-Test-Makros definiert:
_BSD_SOURCE (bis Glibc 2.19), _SVID_SOURCE (bis Glibc 2.19),
_DEFAULT_SOURCE (seit Glibc 2.19), _POSIX_SOURCE und
_POSIX_C_SOURCE=200809L (200112L in Glibc-Versionen vor 2.10; 199506L
in Glibc-Versionen vor 2.4; 199309L in Glibc-Versionen vor 2.1).
Wenn eines von __STRICT_ANSI__, _ISOC99_SOURCE,
_ISOC11_SOURCE (seit Glibc 2.18), _POSIX_SOURCE,
_POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED
(bis Glibc 2.11), _BSD_SOURCE (bis Glibc 2.19) oder
_SVID_SOURCE (bis Glibc 2.19) explizit definiert ist, dann werden
standardmäßig _BSD_SOURCE, _SVID_SOURCE und
_DEFAULT_SOURCE nicht definiert.
Sind _POSIX_SOURCE und _POSIX_C_SOURCE nicht
explizit definiert und entweder __STRICT_ANSI__ ist nicht definiert
oder _XOPEN_SOURCE hat einen Wert von 500 oder mehr, dann
- wird _POSIX_SOURCE auf den Wert 1 gesetzt und
- _POSIX_C_SOURCE erhält einen der folgenden Werte:
- 2, falls _XOPEN_SOURCE mit einem Wert kleiner als 500 definiert
ist;
- 199506L, falls _XOPEN_SOURCE mit einem Wert größer
oder gleich 500 und kleiner als 600 definiert ist; oder
- (Seit Glibc 2.4) 200112L, falls _XOPEN_SOURCE mit einem Wert
größer oder gleich 600 und kleiner als 700 definiert
ist.
- (Seit Glibc 2.4) 200809L, falls _XOPEN_SOURCE mit einem Wert
größer oder gleich 700 definiert ist.
- Ältere Versionen von Glibc kennen die Werte 200112L und 200809L
für _POSIX_C_SOURCE nicht, der Wert für das Makro
hängt also von der Glibc-Version ab.
- Wenn _XOPEN_SOURCE nicht definiert ist, hängt der
zulässige Wert von _POSIX_C_SOURCE von der Glibc-Version ab:
199506L für Glibc-Versionen vor 2.4; 200112L für Glibc 2.4
bis 2.9 und 200809L seit Glibc 2.10.
Es können mehrere Makros definiert werden, die Effekte
akkumulieren sich.
POSIX.1 legt _POSIX_C_SOURCE, _POSIX_SOURCE und
_XOPEN_SOURCE fest.
_XOPEN_SOURCE_EXTENDED wurde von XPG4v2 (auch bekannt als
SUSv1) spezifiziert, ist aber seit SUSv2 vorhanden. _FILE_OFFSET_BITS
kommt in keinem Standard vor, wird aber auf verschiedenen anderen
Implementierungen verwendet.
_BSD_SOURCE, _SVID_SOURCE, _DEFAULT_SOURCE,
_ATFILE_SOURCE, _GNU_SOURCE, _FORTIFY_SOURCE,
_REENTRANT und _THREAD_SAFE sind Linux-spezifisch (Glibc).
<features.h> ist eine Linux/Glibc-spezifische
Header-Datei. Andere Systeme verfügen über eine analoge Datei,
die in der Regel einen anderen Namen trägt. Diese Header-Datei wird
bei Bedarf automatisch durch andere Header-Dateien einbezogen: sie muss
nicht explizit einbezogen werden, um Feature-Test-Makros zu verwenden.
Je nachdem, welche der oben genannten Feature-Test-Makros
definiert sind, definiert <features.h> intern verschiedene
weitere Makros, die von anderen Glibc-Header-Dateien überprüft
werden. Die Namen dieser Makros beginnen mit zwei vorangestellten
Unterstrichen (z. B. __USE_MISC). Programme sollten diese Makros
nie direkt definieren: stattdessen sollten die passenden
Feature-Test-Makro(s) aus der obigen Liste eingesetzt werden.
Mit dem folgenden Programm können Sie erkunden, wie die
verschiedenen Feature-Test-Makros abhängig von der Glibc-Version und
welche explizit gesetzt werden. Die folgende Shell-Sitzung auf einem System
mit Glibc 2.10 zeigt einige Beispiele für mögliche
Ausgaben:
$ cc ftm.c
$ ./a.out
_POSIX_SOURCE definiert
_POSIX_C_SOURCE definiert: 200809L
_BSD_SOURCE definiert
_SVID_SOURCE definiert
_ATFILE_SOURCE definiert
$ cc -D_XOPEN_SOURCE=500 ftm.c
$ ./a.out
_POSIX_SOURCE definiert
_POSIX_C_SOURCE definiert: 199506L
_XOPEN_SOURCE definiert: 500
$ cc -D_GNU_SOURCE ftm.c
$ ./a.out
_POSIX_SOURCE definiert
_POSIX_C_SOURCE definiert: 200809L
_ISOC99_SOURCE definiert
_XOPEN_SOURCE definiert: 700
_XOPEN_SOURCE_EXTENDED definiert
_LARGEFILE64_SOURCE definiert
_BSD_SOURCE definiert
_SVID_SOURCE definiert
_ATFILE_SOURCE definiert
_GNU_SOURCE definiert
/* ftm.c */
#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
#ifdef _POSIX_SOURCE
printf("_POSIX_SOURCE definiert\n");
#endif
#ifdef _POSIX_C_SOURCE
printf("_POSIX_C_SOURCE definiert: %jdL\n",
(intmax_t) _POSIX_C_SOURCE);
#endif
#ifdef _ISOC99_SOURCE
printf("_ISOC99_SOURCE definiert\n");
#endif
#ifdef _ISOC11_SOURCE
printf("_ISOC11_SOURCE definiert\n");
#endif
#ifdef _XOPEN_SOURCE
printf("_XOPEN_SOURCE definiert: %d\n", _XOPEN_SOURCE);
#endif
#ifdef _XOPEN_SOURCE_EXTENDED
printf("_XOPEN_SOURCE_EXTENDED definiert\n");
#endif
#ifdef _LARGEFILE64_SOURCE
printf("_LARGEFILE64_SOURCE definiert\n");
#endif
#ifdef _FILE_OFFSET_BITS
printf("_FILE_OFFSET_BITS definiert: %d\n", _FILE_OFFSET_BITS);
#endif
#ifdef _BSD_SOURCE
printf("_BSD_SOURCE definiert\n");
#endif
#ifdef _SVID_SOURCE
printf("_SVID_SOURCE definiert\n");
#endif
#ifdef _DEFAULT_SOURCE
printf("_DEFAULT_SOURCE definiert\n");
#endif
#ifdef _ATFILE_SOURCE
printf("_ATFILE_SOURCE definiert\n");
#endif
#ifdef _GNU_SOURCE
printf("_GNU_SOURCE definiert\n");
#endif
#ifdef _REENTRANT
printf("_REENTRANT definiert\n");
#endif
#ifdef _THREAD_SAFE
printf("_THREAD_SAFE definiert\n");
#endif
#ifdef _FORTIFY_SOURCE
printf("_FORTIFY_SOURCE definiert\n");
#endif
exit(EXIT_SUCCESS);
}
Diese Seite ist Teil der Veröffentlichung 5.10 des Projekts
Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie
Fehler gemeldet werden können sowie die aktuelle Version dieser Seite
finden sich unter https://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von
Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> und Helge Kreutzmann
<debian@helgefjell.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU General
Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite
finden, schicken Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer.