Provided by:
manpages-de_0.10-1_all 
BEZEICHNUNG
feature_test_macros - Feature-Test-Makros
"UBERSICHT
#include <features.h>
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 f"ur 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.
Einige Feature-Test-Makros helfen bei der Erstellung von portablen
Anwendungen, indem sie die Verwendung nicht standardgemaBer
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 <features.h> ermitteln.
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 <unistd.h>
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
<unistd.h> 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 standardm"aBig definiert
sind. Daher ist es nicht immer erforderlich, die in der UBERSICHT
angegebenen Feature-Test-Makro(s) explizit anzugeben. Einzelheiten
finden Sie weiter unten.
In wenigen Fallen verwenden Handbuchseiten eine Abkurzung fur 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 ermoglicht
und das Makro nicht standardmaBig definiert wird.
Von Glibc >>verstandene<< Feature-Test-Makros
Im Folgenden wird erlautert, wie Feature-Test-Makros in Linux-Glibc
2.x, x > 0, behandelt werden.
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:
o Der Wert 1 aktiviert Definitionen gemaB POSIX.1-1990 und ISO
C (1990).
o Ein Wert gleich oder groBer als 2 aktiviert zusatzlich
Definitionen gemaB POSIX.2-1992.
o Der Wert 199309L oder groBer aktiviert Definitionen gemaB
POSIX.1b (Echtzeiterweiterungen).
o Der Wert 199506L oder groBer aktiviert Definitionen gemaB
POSIX.1c (Threads).
o (Seit Glibc 2.3.3) Der Wert 200112L oder groBer aktiviert
Definitionen gemaB der POSIX.1-2001 Base Specification (ohne
die XSI-Erweiterung).
o (Seit Glibc 2.10) Der Wert 200809L oder groBer aktiviert
Definitionen gemaB 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.
_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 groBer aktiviert zusatzlich die
Definitionen fur SUSv2 (UNIX 98).
o (Seit Glibc 2.2) Der Wert 600 oder groBer 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 groBer aktiviert
zusatzlich Definitionen fur SUSv4 (d.h. die POSIX.1-2001 Base
Specification und die XSI-Erweiterung).
_XOPEN_SOURCE_EXTENDED
Wenn dieses Makro und _XOPEN_SOURCE definiert sind, dann werden
Definitionen entsprechend den XPG4v2- (SUSv1-)UNIX-Erweiterungen
(UNIX 95) aktiviert. Dieses Makro wird auch implizit definiert,
wenn _XOPEN_SOURCE ein Wert von 500 oder groBer zugewiesen wird.
_ISOC99_SOURCE
Aktiviert C99-Erganzungen zu ISO C (1990). Dieses Makro wird
seit Glibc 2.1.3 erkannt; fruhere Glibc 2.1.x-Versionen
verarbeiteten das gleichwertige Makro _ISOC9X_SOURCE (weil der
C99-Standard noch nicht fertig war). Obwohl das letztere Makro
obsolet ist, wird es von der Glibc weiter zwecks
Abwartskompatibilitat unterstutzt.
_LARGEFILE64_SOURCE
Aktiviert Definitionen fur die alternative API-Spezifikation von
der LFS (Large File Summit), die als >>Erweiterung fur den
Ubergang<< zur Single UNIX Specification gedacht ist. (Siehe
http://opengroup.org/platform/lfs.html.) Die 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
diese Schnittstelle nicht verwenden, sondern
_FILE_OFFSET_BITS=64 einsetzen.
_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 nutzlich fur die
Ein-/Ausgabe in und aus groBen Dateien (> 2 Gigabyte) auf
32-Bit-Systemen. (Mit der Definition dieses Makros konnen
korrekt geschriebene Programme nach einer einfachen
Neukompilierung groBe Dateien bearbeiten.) 64-Bit-Systeme
erlauben naturlich DateigroBen groBer als 2 Gigabyte. Auf diesen
Systemen dieses Makro hat keine Wirkung.
_BSD_SOURCE
Die Zuweisung eines beliebigen Wertes fur dieses Makro aktiviert
von BSD abgeleitete Definitionen. Die Definition dieses Makros
bewirkt 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.
_SVID_SOURCE
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).)
_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 groBer oder gleich 200809L definiert ist.
_GNU_SOURCE
Die Definition dieses Makros (mit einem beliebigen Wert) ist
gleichwertig mit der Definition von _BSD_SOURCE, _SVID_SOURCE,
_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). Daruber hinaus werden
verschiedene GNU-spezifische Erweiterungen aktiviert.
Widerspruche zwischen Standards werden unter Ausschluss von
BSD-Funktionen gelost.
_REENTRANT
Die Definition dieses Makros aktiviert bestimmte
wiedereintrittsfahige Funktionen. Fur Multithread-fahige
Programm verwenden Sie stattdessen cc -pthread.
_THREAD_SAFE
Synonym fur _REENTRANT; wird fur die Kompatibilitat mit einigen
anderen Implementierungen bereitgestellt.
_FORTIFY_SOURCE (seit Glibc 2.3.4)
Die Definition dieses Makros bewirkt, dass einige einfache
Kontrollen fur die Erkennung von Pufferuberlauffehlern. Diese
Fehler konnen bei der Verwendung diverser Funktionen fur die
Manipulation von Zeichenketten und Speicher auftreten. Es werden
nicht alle Pufferuberlauffehler erkannt werden, nur einige der
haufigsten Falle. Die aktuelle Implementierung enthalt
Kontrollen fur die Aufrufe von memcpy(3), mempcpy(3),
memmove(3), memset(3), stpcpy(3), strcpy(3), strncpy(3),
strcat(3), strncat(3), sprintf(3), snprintf(3), vsprintf(3),
vsnprintf(3) und gets(3). 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 und fuhren zu Compiler-Warnungen,
andere Kontrollen finden zur Laufzeit statt und fuhren zu einem
Laufzeitfehler, wenn die Uberprufung fehlschlagt. Der Compiler
muss die Verwendung dieses Makros unterstutzen, was fur gcc(1)
seit Version 4.0 der Fall ist.
Standarddefinitionen, implizite Definitionen und Kombinationsdefinitionen
Ohne explizit definierte Feature-Test-Makros werden standardmaBig die
folgenden Feature-Test-Makros definiert: _BSD_SOURCE, _SVID_SOURCE,
_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, _POSIX_SOURCE,
_POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, _BSD_SOURCE
oder _SVID_SOURCE explizit definiert ist, dann werden standardmaBig
_BSD_SOURCE und _SVID_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 erhalt einen der folgenden Werte:
o 2, XOPEN_SOURCE mit einem Wert kleiner als 500 definiert
ist;
o 199506L, XOPEN_SOURCE mit einem Wert groBer oder gleich 500
und kleiner als 600 definiert ist; oder
o (Seit Glibc 2.4) 200112L, XOPEN_SOURCE mit einem Wert
groBer oder gleich 600 und kleiner als 700 definiert ist.
o (Seit Glibc 2.4) 200809L, wenn XOPEN_SOURCE mit einem Wert
groBer 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
fur Glibc-Versionen vor 2.4; 200112L fur Glibc 2.4 bis 2.9
und 200809L seit Glibc 2.10.
Es konnen mehrere Makros definiert werden, die Effekte akkumulieren
sich.
KONFORM ZU
POSIX.1 legt _POSIX_C_SOURCE, _POSIX_SOURCE und _XOPEN_SOURCE fest.
_XOPEN_SOURCE_EXTENDED wurde von XPG4v2 (auch bekannt als SUSv1)
spezifiziert.
_FILE_OFFSET_BITS kommt in keinem Standard vor, wird aber auf
verschiedenen anderen Implementierungen verwendet.
_BSD_SOURCE, _SVID_SOURCE, _ATFILE_SOURCE, _GNU_SOURCE,
_FORTIFY_SOURCE, _REENTRANT und _THREAD_SAFE sind Linux-spezifisch
(Glibc).
ANMERKUNGEN
<features.h> 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 <features.h> 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.
BEISPIEL
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 <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: %ldL\n", (long) _POSIX_C_SOURCE);
#endif
#ifdef _ISOC99_SOURCE
printf("_ISOC99_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 _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);
}
SIEHE AUCH
libc(7), standards(7)
Der Abschnitt >>Feature Test Macros<< unter info libc.
/usr/include/features.h
KOLOPHON
Diese Seite ist Teil der Veroffentlichung 3.32 des Projekts
Linux-man-pages. Eine Beschreibung des Projekts und Informationen, wie
Fehler gemeldet werden konnen, finden sich unter
http://www.kernel.org/doc/man-pages/.
"UBERSETZUNG
Die deutsche Ubersetzung dieser Handbuchseite wurde von Martin Eberhard
Schauer <Martin.E.Schauer@gmx.de> 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 <debian-l10n-
german@lists.debian.org>.