Provided by: manpages-de_1.4-1_all 

BEZEICHNUNG
feature_test_macros - Feature-Test-Makros
ÜBERSICHT
#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ü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.
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.
Spezifikation der Funktion-Test-Makro-Anforderungen in Handbuchseiten
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);
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 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. Einzelheiten
finden Sie weiter unten.
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.
Von Glibc »verstandene« Feature-Test-Makros
Im Folgenden wird erläutert, 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:
• 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 Definitionen gemäß der POSIX.1-2001
Base Specification (ohne die XSI-Erweiterung).
• (Seit Glibc 2.10) Der Wert 200809L oder größer aktiviert 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.
_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).
_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 größer zugewiesen wird.
_ISOC95_SOURCE
Aktiviert »ISO C (1990) Amendment 1«-Definitionen (auch bekannt als C95). Dieses Makro wird seit
Glibc 2.12 erkannt. Die hauptsächliche Änderung in C95 war die Unterstützung internationaler
Zeichensätze. Die Änderungen von C95 wurden in den nachfolgenden Standard C99 aufgenommen (mit
anderen Worten impliziert _ISOC99_SOURCE _ISOC95_SOURCE).
_ISOC99_SOURCE
Aktiviert C99-Ergänzungen zu ISO C (1990). Dieses Makro wird seit Glibc 2.1.3 erkannt; frühere
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
Abwärtskompatibilität unterstützt.
_ISOC11_SOURCE
Aktiviert Deklarationen, die mit dem ISO-C11-Standard konsistent sind. Dieses Makro wird seit
Glibc 2.16 erkannt.
_LARGEFILE64_SOURCE
Expose definitions for the alternative API specified by the LFS (Large File Summit) as a
"transitional extension" to the Single UNIX Specification. (See http://opengroup.org/platform
/lfs.html) The alternative API consists of a set of new objects (i.e., functions and types) whose
names are suffixed with "64" (e.g., off64_t versus off_t, lseek64() versus lseek(), etc.). New
programs should not employ this interface; instead _FILE_OFFSET_BITS=64 should be employed.
_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 nützlich für die Ein-/Ausgabe in und aus großen Dateien (> 2 Gigabyte) auf
32-Bit-Systemen. (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
Die Zuweisung eines beliebigen Wertes für 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 für 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 größer 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). Darüber hinaus werden verschiedene GNU-spezifische Erweiterungen aktiviert. Widersprüche
zwischen Standards werden unter Ausschluss von BSD-Funktionen gelöst.
_REENTRANT
Die Definition dieses Makros aktiviert bestimmte wiedereintrittsfähige Funktionen. Für
Multithread-fähige Programm verwenden Sie stattdessen cc -pthread.
_THREAD_SAFE
Synonym für _REENTRANT; wird für die Kompatibilität mit einigen anderen Implementierungen
bereitgestellt.
_FORTIFY_SOURCE (seit Glibc 2.3.4)
Die Definition dieses Makros bewirkt, dass einige einfache Kontrollen für die Erkennung von
Pufferüberlauffehlern. Diese Fehler können bei der Verwendung diverser Funktionen für die
Manipulation von Zeichenketten und Speicher auftreten. Es werden nicht alle Pufferüberlauffehler
erkannt werden, nur einige der häufigsten Fälle. Die aktuelle Implementierung enthält Kontrollen
für 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
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 und führen zu Compiler-Warnungen, andere Kontrollen
finden zur Laufzeit statt und führen zu einem Laufzeitfehler, wenn die Überprüfung fehlschlägt.
Der Compiler muss die Verwendung dieses Makros unterstützen, was für gcc(1) seit Version 4.0 der
Fall ist.
Standarddefinitionen, implizite Definitionen und Kombinationsdefinitionen
Ohne explizit definierte Feature-Test-Makros werden standardmäßig 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).
If any of __STRICT_ANSI__, _ISOC99_SOURCE, _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE,
_XOPEN_SOURCE_EXTENDED, _BSD_SOURCE, or _SVID_SOURCE is explicitly defined, then _BSD_SOURCE, and
_SVID_SOURCE are not defined by default.
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, XOPEN_SOURCE mit einem Wert kleiner als 500 definiert ist;
• 199506L, XOPEN_SOURCE mit einem Wert größer oder gleich 500 und kleiner als 600 definiert
ist; oder
• (Seit Glibc 2.4) 200112L, XOPEN_SOURCE mit einem Wert größer oder gleich 600 und kleiner als
700 definiert ist.
• (Seit Glibc 2.4) 200809L, wenn 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.
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 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.
BEISPIEL
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
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
This page is part of release 3.54 of the Linux man-pages project. A description of the project, and
information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <Martin.E.Schauer@gmx.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
<debian-l10n-german@lists.debian.org>.
Linux 2012-08-05 FEATURE_TEST_MACROS(7)