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

    •   (Since glibc 2.3.3) The value 200112L or greater additionally exposes definitions corresponding to the POSIX.1-2001 base specification (excluding the XSI extension) and also causes C95 (since glibc 2.12) and C99 (since glibc 2.10) features to be exposed.

    •   (Seit Glibc 2.10) Der Wert 200809L oder größer aktiviert zusätzlich 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).

    If __STRICT_ANSI__ is not defined, or _XOPEN_SOURCE is defined with a value greater than or equal to 500 and neither _POSIX_SOURCE not _POSIX_C_SOURCE is explicitly defined, then the following macros are implicitly defined:

    •   _POSIX_SOURCE wird auf den Wert 1 gesetzt.

    •   _POSIX_C_SOURCE wird definiert, entsprechend des Wertes von _XOPEN_SOURCE:

        _XOPEN_SOURCE < 500
            _POSIX_SOURCE wird auf den Wert 2 gesetzt.

        500 <= _XOPEN_SOURCE < 600
            _POSIX_SOURCE wird auf den Wert 199506L gesetzt.

        600 <= _XOPEN_SOURCE < 700
            _POSIX_SOURCE wird auf den Wert 200112L gesetzt.

        700 <= _XOPEN_SOURCE (seit Glibc 2.10)
            _POSIX_SOURCE wird auf den Wert 200809L gesetzt.

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

_ISOC99_SOURCE (seit Glibc 2.1.3)
    Aktiviert Deklarationen, die mit dem ISO-C99-Standard konsistent sind. Earlier glibc 2.1.x versions recognized an equivalent macro named _ISOC9X_SOURCE (because the C99 standard had not then been finalized). Although the use of this macro is obsolete, glibc continues to recognize it for backward compatibility. Defining _ISOC99_SOURCE also exposes ISO C (1990) Amendment 1 ("C95") definitions. (The primary change in C95 was support for international character sets.)

_ISOC11_SOURCE (seit Glibc 2.16)
    Exposes declarations consistent with the ISO C11 standard. Defining this macro also enables C99 and C95 features (like _ISOC99_SOURCE).

_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 macro; instead _FILE_OFFSET_BITS=64 should be employed.

_LARGEFILE_SOURCE
    This macro was historically used to expose certain functions (specifically fseeko(3) and ftello(3)) that address limitations of earlier APIs (feek(3) and ftell(3)) that use long int for file offsets. This macro is implicitly defined if _XOPEN_SOURCE is defined with a value greater than or equal to 500. New programs should not employ this macro; defining _XOPEN_SOURCE as just described or defining _FILE_OFFSET_BITS with the value 64 is the preferred mechanism to achieve the same result.

_FILE_OFFSET_BITS
    Defining this macro with the value 64 automatically converts references to 32-bit functions and data types related to file I/O and filesystem operations into references to their 64-bit counterparts. This is useful for performing I/O on large files (> 2 Gigabytes) on 32-bit systems. (Defining this macro permits correctly written programs to use large files with only a recompilation being required.) 64-Bit-Systeme erlauben natürlich Dateigrößen größer als 2 Gigabyte. Auf diesen Systemen dieses Makro hat keine Wirkung.

_BSD_SOURCE (misbilligt seit Glibc 2.20)
    Defining this macro with any value causes header files to expose BSD-derived definitions. In glibc versions up to and including 2.18, defining this macro also causes BSD definitions to be preferred in some situations where standards conflict, unless one or more of _SVID_SOURCE, _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, or _GNU_SOURCE is defined, in which case BSD definitions are disfavored. Since glibc 2.19, _BSD_SOURCE no longer causes BSD definitions to be preferred in case of conflicts. Since glibc 2.20, this macro is deprecated. It now has the same effect as defining _DEFAULT_SOURCE, but generates a compile-time warning (unless _DEFAULT_SOURCE is also defined). Use _DEFAULT_SOURCE instead. To allow code that requires _BSD_SOURCE in glibc 2.19 and earlier and _DEFAULT_SOURCE in glibc 2.20 and later to compile without warnings, define both _BSD_SOURCE and _DEFAULT_SOURCE.

_SVID_SOURCE (misbilligt seit Glibc 2.20)
    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).) Since glibc 2.20, this macro is deprecated in the same fashion as _BSD_SOURCE.

_DEFAULT_SOURCE (seit Glibc 2.19)
    This macro can be defined to ensure that the "default" definitions are provided even when the defaults would otherwise be disabled, as happens when individual macros are explicitly defined, or the compiler is invoked in one of its "standard" modes (e.g., cc -std=c99). Defining _DEFAULT_SOURCE without defining other individual macros or invoking the compiler in one of its "standard" modes has no effect. The "default" definitions comprise those required by POSIX.1-2008 as well as various definitions derived from BSD and System V. On glibc 2.19 and earlier, these defaults were approximately equivalent to explicitly defining the following:
        cc -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809

_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) definiert implizit _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. Since glibc 2.19, defining _GNU_SOURCE also has the effect of implicitly defining _DEFAULT_SOURCE. In glibc versions before 2.20, defining _GNU_SOURCE also had the effect of implicitly defining _BSD_SOURCE and _SVID_SOURCE.

_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)
    Defining this macro causes some lightweight checks to be performed to detect some buffer overflow errors when employing various string and memory manipulation functions. Not all buffer overflows are detected, just some common cases. In der aktuellen Implementierung werden Prüfungen für 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) hinzugefügt. If _FORTIFY_SOURCE is set to 1, with compiler optimization level 1 (gcc -O1) and above, checks that shouldn't change the behavior of conforming programs are performed. With _FORTIFY_SOURCE set to 2 some more checking is added, but some conforming programs might fail. Some of the checks can be performed at compile time, and result in compiler warnings; other checks take place at run time, and result in a run-time error if the check fails. Die Verwendung dieses Makros benötigt die Unterstützung durch den Compiler. Diese ist in gcc(1) seit Version 4.0 verfügbar.

  Standarddefinitionen, implizite Definitionen und Kombinationsdefinitionen

If no feature test macros are explicitly defined, then the following feature test macros are defined by default: _BSD_SOURCE (in glibc 2.19 and earlier), _SVID_SOURCE (in glibc 2.19 and earlier), _DEFAULT_SOURCE (since glibc 2.19), _POSIX_SOURCE, and _POSIX_C_SOURCE=200809L (200112L in glibc versions before 2.10; 199506L in glibc versions before 2.4; 199309L in glibc versions before 2.1).

If any of __STRICT_ANSI__, _ISOC99_SOURCE, _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, _BSD_SOURCE (in glibc 2.19 and earlier), or _SVID_SOURCE (in glibc 2.19 and earlier) is explicitly defined, then _BSD_SOURCE, _SVID_SOURCE, and _DEFAULT_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, falls _XOPEN_SOURCE mit einem Wert kleiner als 500 definiert ist;

    •   199506L, falls _XOPEN_SOURCE mit einem Wert größer oder gleich 500 und kleiner als 600 definiert ist; oder

    •   (Seit Glibc 2.4) 200112L, falls _XOPEN_SOURCE mit einem Wert größer oder gleich 600 und kleiner als 700 definiert ist.

    •   (Seit Glibc 2.4) 200809L, falls _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, _DEFAULT_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 _ISOC11_SOURCE
    printf("_ISOC11_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 _DEFAULT_SOURCE
    printf("_DEFAULT_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.70 of the Linux man-pages project. A description of the project, information about reporting bugs, and the latest version of this page, 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>.