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
- Aktiviert Definitionen für die alternative
API-Spezifikation von der LFS (Large File Summit), die als
»Erweiterung für den Übergang« zur Single UNIX
Specification gedacht ist. (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 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 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).
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 standardmäßig
_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 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.
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¶
Diese Seite ist Teil der Veröffentlichung 3.42 des Projekts Linux-
man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler
gemeldet werden können, finden sich unter
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>.