feature_test_macros(7) Miscellaneous Information Manual BEZEICHNUNG feature_test_macros - Feature-Test-Makros BESCHREIBUNG 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 fur 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 Einschrankungen gegenseitig einbinden durfen. Daher kann beispielsweise in den nachfolgenden Zeilen die Definition des Makros _GNU_SOURCE keine Wirkung haben, da der Header selbst einbindet (POSIX erlaubt dies explizit): #include #define _GNU_SOURCE #include Einige Feature-Test-Makros helfen bei der Erstellung von portablen Anwendungen, indem sie die Verwendung nicht standardgemasser Definitionen verhindern. Andere Makros konnen 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 konnen Sie durch Auswertung der Header-Datei ermitteln. Anmerkung: Applikationen mussen nicht direkt einbinden; es ist im Gegenteil sogar unerwunscht. Siehe ANMERKUNGEN. Spezifikation der Funktion-Test-Makro-Anforderungen in Handbuchseiten Wenn eine Funktion die Definition eines Feature-Test-Makros erfordert, enthalt die UBERSICHT einer Handbuchseit in der Regel einen Vermerk der folgenden Form (dieses Beispiel finden Sie in der Handbuchseite von acct(2)): #include int acct(const char *filename); Mit Glibc erforderliche Makros (siehe feature_test_macros(7)): acct(): _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500) Das || bedeutet, dass zwecks Ermittlung der Deklaration von acct(2) aus eine der beiden folgenden Makro-Definitionen vor dem Einfugen jeglicher Header-Dateien erfolgen muss: #define _BSD_SOURCE #define _XOPEN_SOURCE /* oder jeder Wert < 500 */ Alternativ konnen 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 standardmassig definiert sind. Daher ist es nicht immer erforderlich, die in der UBERSICHT angegebenen Feature-Test-Makro(s) explizit anzugeben. In wenigen Fallen verwenden Handbuchseiten eine Abkurzung fur die Anforderungen der Feature-Test-Makros (dieses Beispiel stammt aus readahead(2)): #define _GNU_SOURCE #define _FILE_OFFSET_BITS 64 #include ssize_t readahead(int fd, off_t *Versatz, size_t Zahler); Dieses Format wird immer dann angewandt, wenn die Feature-Test-Makros sicherstellen, dass passende Funktionsdeklarationen sichtbar sind und die Makros nicht standardmassig definiert werden. Von Glibc >>verstandene<< Feature-Test-Makros In den Absatzen weiter unten wird erlautert, wie Feature-Test-Makros in Glibc 2.x, x > 0, behandelt werden. Zuerst eine Zusammenfassung einiger Details fur den Ungeduldigen: o In modernem Quellcode mussen Sie hochstwahrscheinlich _POSIX_C_SOURCE (fur Definitionen aus verschiedenen Versionen von POSIX.1), _XOPEN_SOURCE (fur Definitionen aus verschiedenen Versionen von SUS), _GNU_SOURCE (fur GNU- und/oder Linux-spezifischem Zeug) und _DEFAULT_SOURCE (fur normalerweise standardmassig bereitgestellte Definitionen) verwenden. o Bestimmte Makros sind mit Vorgabewerten definiert. Daher mag es nicht notwendig sein, sie explizit zu definieren, obwohl eine oder mehrere Makros in der UBERSICHT einer Handbuchseite als benotigt markiert sind. Die vollstandigen Details der Vorgaben sind spater in dieser Handbuchseite dargestellt. o 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 grosser. Hierbei kann _POSIX_C_SOURCE >= 200112L in den Feature-Test-Makro-Anforderungen in der UBERSICHT einer Handbuchseite ist implizit angenommen, dass das Folgende den gleichen Effekt hat: _XOPEN_SOURCE >= 600 o 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 grosser. Hierbei kann _POSIX_C_SOURCE >= 200809L in den Feature-Test-Makro-Anforderungen in der UBERSICHT einer Handbuchseite ist implizit angenommen, dass das Folgende den gleichen Effekt hat: _XOPEN_SOURCE >= 700 Die 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: o Der Wert 1 aktiviert Definitionen gemass POSIX.1-1990 und ISO C (1990). o Ein Wert gleich oder grosser als 2 aktiviert zusatzlich Definitionen gemass POSIX.2-1992. o Der Wert 199309L oder grosser aktiviert Definitionen gemass POSIX.1b (Echtzeiterweiterungen). o Der Wert 199506L oder grosser aktiviert Definitionen gemass POSIX.1c (Threads). o (Seit Glibc 2.3.3) Der Wert 200112L oder grosser aktiviert zusatzlich Definitionen gemass der POSIX.1-2001 Base Specification (ohne die XSI-Erweiterung). Dieser Wert fuhrt auch zur Aktivierung von C95- (seit Glibc 2.12) und C99 (seit Glibc 2.10) Funktionalitaten (mit anderen Worten, dies ist aquivalent zur Definition von _ISOC99_SOURCE). o (Seit Glibc 2.10) Der Wert 200809L oder grosser aktiviert zusatzlich Definitionen gemass der POSIX.1-2008 Base Specification (ohne die XSI-Erweiterung). _POSIX_SOURCE Die Definition dieses uberholten 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: o Die Zuweisung eines beliebigen Wertes aktiviert Definitionen nach POSIX.1, POSIX.2 und XPG4. o Der Wert 500 oder grosser aktiviert zusatzlich die Definitionen fur SUSv2 (UNIX 98). o (Seit Glibc 2.2) Der Wert 600 oder grosser aktiviert zusatzlich Definitionen fur SUSv3 (UNIX 03, also die POSIX.1-2001 Base Specification und die XSI-Erweiterung) sowie C99-Definitionen. o (Seit Glibc 2.10) Der Wert 700 oder grosser aktiviert zusatzlich Definitionen fur 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 grosser als 500 und weder _POSIX_SOURCE noch _POSIX_C_SOURCE explizit definiert sind dann werden die folgenden Makros implizit definiert: o _POSIX_SOURCE wird auf den Wert 1 gesetzt. o _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. Zusatzlich 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 UBERSICHT in Handbuchseiten nicht beschrieben. _ISOC99_SOURCE (seit Glibc 2.1.3) Aktiviert Deklarationen, die mit dem ISO-C99-Standard konsistent sind. Fruhere 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 Abwartskompatibilitat unterstutzt. Die Definition von _ISOC99_SOURCE aktiviert auch ISO C (1990) Anhang 1-Definitionen (>>C95<<). (Die hauptsachliche Anderung in C95 war die Unterstutzung fur internationale Zeichensatze.) 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-Funktionalitaten (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 fur das durch LFS (Large File Summit) definierte alternative API als >>Ubergangserweiterungen<< zu der >>Single UNIX Specification<<. (Siehe .) 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 Beschrankungen alterer APIs (fseek(3) und ftell(3)) kummerten, die long fur Datei-Versatze verwandten. Dieses Makro ist implizit definiert, falls _XOPEN_SOURCE mit einem Wert gleich oder grosser 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 fur Datei-Ein/Ausgabe und Dateisystem-Operationen in Verweise auf ihre 64-Bit-Pendants konvertiert. Dies ist fur die Ein-/Ausgabe in und aus grossen Dateien (> 2 Gigabyte) auf 32-Bit-Systemen nutzlich. Es ist auch beim Aufruf von Funktionen wie copy_file_range(2) nutzlich, die in jungerer Zeit hinzugefugt wurden und nur in 64-bit-Varianten existieren. (Mit der Definition dieses Makros konnen korrekt geschriebene Programme nach einer einfachen Neukompilierung grosse Dateien bearbeiten.) 64-Bit-Systeme erlauben naturlich Dateigrossen grosser als 2 Gigabyte. Auf diesen Systemen dieses Makro hat keine Wirkung. _TIME_BITS Wird diesem Makro der Wert 64 zugewiesen, dann wird die Breite von time_t(3type) auf 64 bit geandert, was den Umgang mit Zeitstempeln jenseits von 2038 erlaubt. Dies ist eng mit _FILE_OFFSET_BITS verwandt und konnte, abhangig von der Implementierung, benotigen, dass dies gesetzt ist. Dieses Makro ist mit Glibc 2.34 verfugbar. _BSD_SOURCE (missbilligt seit Glibc 2.20) Mit der Definition dieses Makros mit irgend einem Wert stellen Header-Dateien BSD-abgeleitete Definitionen bereit. In Glibc bis einschliesslich 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 fuhrt _BSD_SOURCE nicht mehr dazu, dass BSD-Definitionen im Konfliktfall bevorzugt werden. Seit Glibc 2.20 wird dieses Makro missbilligt. Es hat jetzt den gleichen Effekt wie die Definition von _DEFAULT_SOURCE, erzeugt aber eine Compiler-Warnung (ausser _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 benotigt, um ohne Warnung ubersetzt zu werden, definieren Sie sowohl _BSD_SOURCE als auch _DEFAULT_SOURCE. _SVID_SOURCE (missbilligt 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 fur System V Interface Definition; siehe standards(7).) Dieses Makro wird in der gleichen Art wie _BSD_SOURCE seit Glibc 2.20 missbilligt. _DEFAULT_SOURCE (seit Glibc 2.19) Dieses Makro kann definiert werden, um sicherzustellen, dass die >>Standarddefinitionen<< bereitgestellt werden, selbst wenn die Vorgaben ansonsten deaktiviert wurden. 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 ursprunglich aus BDS und System V abgeleitete Definitionen. Bis Glibc 2.19 waren diese Standardwerte ungefahr 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 grosser 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 vor Glibc 2.10; 199506L vor Glibc 2.5; 199309L vor Glibc 2.1) und _XOPEN_SOURCE mit dem Wert 700 (600 vor Glibc 2.10; 500 vor Glibc 2.2). Daruber 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. Vor Glibc 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 konnten dies noch immer benotigen). Unter Glibc legte dieses Makro auch Definitionen von bestimmten, wiedereintrittsfahigen Funktionen offen. Allerdings ist Glibc standardmassig 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 hoher aktiviert werden. _REENTRANT ist jetzt veraltet. Seit Glibc 2.25 ist die Definition von _REENTRANT aquivalent zur Definition von _POSIX_C_SOURCE mit dem Wert 199606L. Falls durch eine andere Methode eine hohere Konformitatsstufe (wie _POSIX_C_SOURCE selbst, _XOPEN_SOURCE, _DEFAULT_SOURCE oder _GNU_SOURCE) ausgewahlt wird, hat die Definition von _REENTRANT keinen Effekt. Dieses Makro wird automatisch definiert, falls mit cc -pthread kompiliert wird. _THREAD_SAFE Synonym fur das (veraltete) _REENTRANT; wird fur die Kompatibilitat mit einigen anderen Implementierungen bereitgestellt. _FORTIFY_SOURCE (seit Glibc 2.3.4) Die Definition dieses Makros fuhrt dazu, dass ein paar leichtgewichtige Prufungen durchgefuhrt werden, um einige Pufferuberlauffehler beim Einsatz verschiedener Zeichenketten- und Speicherveranderungsfunktionen (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 gepruft, beispielsweise dass bei open(2) ein Argument mode ubergeben wurde, wenn die angegebenen Schalter O_CREAT enthalten. Es werden nicht alle Probleme sondern lediglich einige haufige Falle erkannt. Ist der Wert von _FORTIFY_SOURCE gleich 1 und die Compiler-Optimierungsstufe 1 (gcc -O1) oder hoher, erfolgt eine Beschrankung auf Kontrollen, die das Verhalten standardkonformer Programme nicht andern sollten. Wird _FORTIFY_SOURCE auf 2 gesetzt, werden ein paar Kontrollen hinzugefugt, die aber Fehler in einigen standardkonformen Programmen bewirken konnten. Einige der Prufungen konnen bei der Kompilierung ausgefuhrt werden (mittels in Header-Dateien implementierter Makrologik) und fuhren zu Compiler-Warnungen, andere Kontrollen finden zur Laufzeit statt und fuhren zu einem Laufzeitfehler, wenn die Uberprufung fehlschlagt. Ist _FORTIFY_SOURCE auf 3 gesetzt, dann werden zusatzliche Uberprufungen hinzugefugt, um einige Funktionsaufrufe abzufangen, die mit einem Argument variabler Grosse verwandt werden, bei denen der Compiler eine obere Grenze fur ihren Wert ableiten kann. Beispielsweise kann ein Programm, bei denen das Grosse-Argument von malloc(3) eine Variable ist, jetzt mit Fortify gesichert werden. Die Verwendung dieses Makros benotigt Unterstutzung vom Compiler, die seit GCC 4.0 und Clang 2.6 verfugbar ist. Die Verwendung von _FORTIFY_SOURCE gesetzt auf 3 benotigt GCC 12.0 oder neuer oder Clang 9.0 oder neuer, zusammen mit Glibc 2.33 oder neuer. Standarddefinitionen, implizite Definitionen und Kombinationsdefinitionen Ohne explizit definierte Feature-Test-Makros werden standardmassig 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 vor Glibc 2.10; 199506L vor Glibc 2.4; 199309L vor Glibc 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 standardmassig _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 o wird _POSIX_SOURCE auf den Wert 1 gesetzt und o _POSIX_C_SOURCE erhalt einen der folgenden Werte: o 2, falls _XOPEN_SOURCE mit einem Wert kleiner als 500 definiert ist; o 199506L, falls _XOPEN_SOURCE mit einem Wert grosser oder gleich 500 und kleiner als 600 definiert ist; oder o (Seit Glibc 2.4) 200112L, falls _XOPEN_SOURCE mit einem Wert grosser oder gleich 600 und kleiner als 700 definiert ist. o (Seit Glibc 2.4) 200809L, falls _XOPEN_SOURCE mit einem Wert grosser oder gleich 700 definiert ist. o Altere Versionen von Glibc kennen die Werte 200112L und 200809L fur _POSIX_C_SOURCE nicht, der Wert fur das Makro hangt also von der Glibc-Version ab. o Wenn _XOPEN_SOURCE nicht definiert ist, hangt der zulassige Wert von _POSIX_C_SOURCE von der Glibc-Version ab: 199506L vor Glibc 2.4; 200112L seit Glibc 2.4 bis 2.9 und 200809L seit Glibc 2.10. Es konnen mehrere Makros definiert werden, die Effekte akkumulieren sich. STANDARDS POSIX.1 legt _POSIX_C_SOURCE, _POSIX_SOURCE und _XOPEN_SOURCE fest. _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 Glibc-spezifisch. GESCHICHTE _XOPEN_SOURCE_EXTENDED wurde von XPG4v2 (auch bekannt als SUSv1) spezifiziert, ist aber seit SUSv2 vorhanden. ANMERKUNGEN ist eine Linux/Glibc-spezifische Header-Datei. Andere Systeme verfugen uber eine analoge Datei, die in der Regel einen anderen Namen tragt. 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 intern verschiedene weitere Makros, die von anderen Glibc-Header-Dateien uberpruft 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. BEISPIELE Mit dem folgenden Programm konnen Sie erkunden, wie die verschiedenen Feature-Test-Makros abhangig von der Glibc-Version und welche explizit gesetzt werden. Die folgende Shell-Sitzung auf einem System mit Glibc 2.10 zeigt einige Beispiele fur mogliche 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 Programmquelltext /* ftm.c */ #include #include #include #include int main(int argc, char *argv[]) { #ifdef _POSIX_SOURCE printf("_POSIX_SOURCE ist definiert\n"); #endif #ifdef _POSIX_C_SOURCE printf("_POSIX_C_SOURCE ist definiert: %jdL\n", (intmax_t) _POSIX_C_SOURCE); #endif #ifdef _ISOC99_SOURCE printf("_ISOC99_SOURCE ist definiert\n"); #endif #ifdef _ISOC11_SOURCE printf("_ISOC11_SOURCE ist definiert\n"); #endif #ifdef _XOPEN_SOURCE printf("_XOPEN_SOURCE ist definiert: %d\n", _XOPEN_SOURCE); #endif #ifdef _XOPEN_SOURCE_EXTENDED printf("_XOPEN_SOURCE_EXTENDED ist definiert\n"); #endif #ifdef _LARGEFILE64_SOURCE printf("_LARGEFILE64_SOURCE ist definiert\n"); #endif #ifdef _FILE_OFFSET_BITS printf("_FILE_OFFSET_BITS ist definiert: %d\n", _FILE_OFFSET_BITS); #endif #ifdef _TIME_BITS printf("_TIME_BITS ist definiert: %d\n", _TIME_BITS); #endif #ifdef _BSD_SOURCE printf("_BSD_SOURCE ist definiert\n"); #endif #ifdef _SVID_SOURCE printf("_SVID_SOURCE ist definiert\n"); #endif #ifdef _DEFAULT_SOURCE printf("_DEFAULT_SOURCE ist definiert\n"); #endif #ifdef _ATFILE_SOURCE printf("_ATFILE_SOURCE ist definiert\n"); #endif #ifdef _GNU_SOURCE printf("_GNU_SOURCE ist definiert\n"); #endif #ifdef _REENTRANT printf("_REENTRANT ist definiert\n"); #endif #ifdef _THREAD_SAFE printf("_THREAD_SAFE ist definiert\n"); #endif #ifdef _FORTIFY_SOURCE printf("_FORTIFY_SOURCE ist definiert\n"); #endif exit(EXIT_SUCCESS); } SIEHE AUCH libc(7), standards(7), system_data_types(7) Der Abschnitt >>Feature Test Macros<< unter info libc. /usr/include/features.h UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.9.1 15. Juni 2024 feature_test_macros(7)