Scroll to navigation

FEATURE_TEST_MACROS(7) Linux-Programmierhandbuch FEATURE_TEST_MACROS(7)

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.

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

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>.
5. August 2012 Linux