Provided by: manpages-de_1.4-1_all bug

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>.