feature_test_macros(7)

NOM
feature_test_macros – Macros de test de fonctionnalités

DESCRIPTION
Les macros de test de fonctionnalités permettent au programmeur de contrôler quelles définitions sont exposées par les fichiers d'en-têtes système lorsqu'un programme est compilé.

NOTE : pour avoir un effet, une macro de test de fonctionnalités doit être définie avant d'inclure tout fichier d'en-tête. Cela peut être accompli soit dans la ligne de commande de compilation (cc -DMACRO=valeur), soit en définissant la macro dans le code source avant d'inclure tout en-tête. L’exigence que la macro soit définie avant d’inclure n’importe quel fichier d’en-tête existe parce que les fichiers d’en-tête peuvent librement s’inclure mutuellement. Donc, par exemple, dans les lignes suivantes, définir la macro _GNU_SOURCE peut n’avoir aucun effet parce que l’en-tête <abc.h> lui-même inclut <xyz.h> (POSIX le permet explicitement) :

    #include <abc.h>
    #define _GNU_SOURCE
    #include <xyz.h>

Certaines macros de test de fonctionnalités sont utiles pour créer des applications portables, en empêchant des définitions non normalisées d'être exposées. D'autres macros peuvent être utilisées pour exposer des définitions non normalisées qui ne sont pas exposées par défaut.

Les effets précis de chacune des macros décrites ci-dessous peuvent être vérifiés en inspectant le fichier d'en-tête <features.h>. Remarque : les applications n’ont pas besoin d’inclure directement <features.h>. En fait, le faire est fortement déconseillé. Consultez les NOTES.

  Spécification des exigences de macro de test de fonctionnalités dans les pages de manuel
Quand une fonction nécessite qu'une macro de test de fonctionnalités soit définie, la section SYNOPSIS de la page de manuel comprend généralement une note de la forme suivante (exemple pris dans la page de manuel acct(2)) :

    #include <unistd.h>

    int acct(const char *fichier);

            Exigences de macros de test de fonctionnalités pour
            la glibc (consultez feature_test_macros(7)) :

    acct() : _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)

Les doubles barres || signifient que pour obtenir la déclaration de acct(2) depuis <unistd.h>, une des définitions de macros doit être utilisée avant d'inclure les fichiers d'en-tête :

    #define _BSD_SOURCE
    #define _XOPEN_SOURCE        /* Ou toute valeur < 500 */

Autrement, des définitions équivalentes peuvent être faites lors de l'appel au compilateur :

    cc -D_BSD_SOURCE
    cc -D_XOPEN_SOURCE           # Ou toute valeur < 500

Veuillez noter que, comme décrit ci-dessous, certaines macros de test de fonctionnalités sont définies par défaut, et il n'est donc pas toujours nécessaire de spécifier explicitement les macros indiquées dans le SYNOPSIS.

Dans certains cas, les pages de manuel utilisent des raccourcis pour exprimer la nécessité de certaines macros de test (exemple tiré de readahead(2)) :

        #define _GNU_SOURCE
        #define _FILE_OFFSET_BITS 64
        #include <fcntl.h>

    ssize_t readahead(int fd, off_t *offset, size_t count);

This format is employed when the feature test macros ensure that the proper function declarations are visible, and the macros are not defined by default.

  Macros de test de fonctionnalités comprises par la glibc
Les paragraphes suivants expliquent comment les macros de test de fonctionnalités sont gérées dans les glibc 2.x, x > 0.

Tout d’abord, un aperçu de quelques détails pour l’impatient :

-   Les macros les plus susceptibles d’être utilisées dans des codes source modernes sont _POSIX_C_SOURCE (pour des définitions de diverses versions de POSIX.1), _XOPEN_SOURCE (pour des définitions de diverses versions de SUS), _GNU_SOURCE (pour certaines choses spécifiques à GNU ou Linux) et _DEFAULT_SOURCE (pour obtenir des définitions qui normalement devrait être fournies par défaut).

-   Certaines macros sont définies avec des valeurs par défaut. Par conséquent, même si une ou plusieurs macros sont indiquées comme nécessaires dans le SYNOPSIS d’une page de manuel, il peut ne pas être nécessaire de les définir explicitement. Tous les détails sur les valeurs par défaut sont donnés ci-après dans cette page de manuel.

-   Définir _XOPEN_SOURCE avec une valeur de 600 ou plus produit le même effet que définir _POSIX_C_SOURCE avec une valeur de 200112L ou supérieure. Lorsqu’apparaît

        _POSIX_C_SOURCE >= 200112L

    dans les nécessités des macros de test de fonctionnalités dans le SYNOPSIS d’une page de manuel, il est implicite que ce qui suit a le même effet :

        _XOPEN_SOURCE >= 600

-   Définir _XOPEN_SOURCE avec une valeur de 700 ou plus produit le même effet que définir _POSIX_C_SOURCE avec une valeur de 200809L ou supérieure. Lorsqu’apparaît

        _POSIX_C_SOURCE >= 200809L

    dans les nécessités des macros de test de fonctionnalités dans le SYNOPSIS d’une page de manuel, il est implicite que ce qui suit a le même effet :

        _XOPEN_SOURCE >= 700

La glibc comprend les macros de test de fonctionnalités suivantes :

__STRICT_ANSI__
    Norme C ISO. Cette macro est définie implicitement par gcc(1) lors des appels avec, par exemple, l'indicateur -std=c99 ou -ansi.

_POSIX_C_SOURCE
    Si cette macro est définie, les en-têtes exposent les définitions suivantes :

    -   La valeur 1 expose les définitions conformes à POSIX.1-1990 et C ISO (1990).

    -   Les valeurs supérieures ou égales à 2 exposent en plus les définitions de POSIX.2-1992.

    -   Les valeurs supérieures ou égales à 199309L exposent en plus les définitions de POSIX.1b (extensions temps-réel).

    -   Les valeurs supérieures ou égales à 199506L exposent en plus les définitions de POSIX.1c (threads).

    -   (Depuis la glibc 2.3.3) Les valeurs supérieures ou égales à 200112L exposent de plus les définitions correspondantes à la spécification de base POSIX.1-2001 (sans l'extension XSI) et activent également les fonctionnalités C95 (depuis la glibc 2.12) et C99 (depuis la glibc 2.10) — en d’autres mots, l’équivalent de définir _ISOC99_SOURCE.

    -   (Depuis la glibc 2.10) Les valeurs supérieures ou égales à 200809L exposent de plus les définitions correspondantes à la spécification de base POSIX.1-2008 (sans l'extension XSI).

_POSIX_SOURCE
    Définir cette macro obsolète (quelle que soit sa valeur) est équivalent à définir _POSIX_C_SOURCE à la valeur 1.

    Puisque cette macro est obsolète, son utilisation n’est généralement pas documentée lors de l’explication des nécessités de macros de test de fonctionnalités dans les pages de manuel.

_XOPEN_SOURCE
    Si cette macro est définie, les en-têtes exposent les définitions suivantes :

    -   Si elle est définie, quelle que soit sa valeur, les définitions de POSIX.1, POSIX.2 et XPG4 sont exposées.

    -   Les valeurs supérieures ou égales à 500 exposent les définitions de SUSv2 (UNIX 98).

    -   (Depuis la glibc 2.2) Les valeurs supérieures ou égales à 600 exposent les définitions de SUSv3 (UNIX 03, c'est-à-dire la spécification de base POSIX.1-2001 plus l'extension XSI) et de C99.

    -   (Depuis la glibc 2.10) Les valeurs supérieures ou égales à 700 exposent les définitions de SUSv4 (c'est-à-dire la spécification de base POSIX.1-2008 plus l'extension XSI).

    Si __STRICT_ANSI__ n'est pas définie, ou si _XOPEN_SOURCE est définie avec une valeur supérieure ou égale à 500 et que ni _POSIX_SOURCE ni _POSIX_C_SOURCE ne sont explicitement définies, alors les macros suivantes sont implicitement définies :

    -   _POSIX_SOURCE est définie à la valeur 1.

    -   _POSIX_SOURCE est définie d'après la valeur de _XOPEN_SOURCE :

        _XOPEN_SOURCE < 500
            _POSIX_C_SOURCE est définie à la valeur 2.

        500 <= _XOPEN_SOURCE < 600
            _POSIX_C_SOURCE est définie à la valeur 199506L.

        600 <= _XOPEN_SOURCE < 700
            _POSIX_C_SOURCE est définie à la valeur 200112L.

        700 <= _XOPEN_SOURCE (depuis la glibc 2.10)
            _POSIX_C_SOURCE est définie à la valeur 200809L.

    De plus, définir _XOPEN_SOURCE avec une valeur de 500 ou supérieure produit le même effet que définir _XOPEN_SOURCE_EXTENDED.

_XOPEN_SOURCE_EXTENDED
    Si cette macro et _XOPEN_SOURCE sont définies, exposer les définitions correspondant aux extensions XPG4v2 (SUSv1) d'UNIX (UNIX 95). Définir _XOPEN_SOURCE avec une valeur de 500 ou supérieure produit aussi le même effet que définir _XOPEN_SOURCE_EXTENDED. L’utilisation de _XOPEN_SOURCE_EXTENDED dans un nouveau code source est à éviter.

    Puisque définir _XOPEN_SOURCE avec une valeur de 500 ou supérieure produit aussi le même effet que définir _XOPEN_SOURCE_EXTENDED, cette dernière (obsolète) macro de test de fonctionnalités n’est généralement pas décrite dans le SYNOPSIS des pages de manuel.

_ISOC99_SOURCE (depuis la glibc 2.1.3)
    Exposer des déclarations cohérentes avec la norme ISO C99.

    Les versions antérieures de la glibc 2.1.x reconnaissaient une macro équivalente appelée _ISOC9X_SOURCE (parce que la norme C99 n'était pas finalisée). Même si l'utilisation de cette dernière macro est à proscrire, la glibc continue à la reconnaître pour des raisons de compatibilité ascendante.

    Si _ISOC99_SOURCE est définie, les définitions du premier amendement au C ISO (1990) (aussi appelé C95) sont aussi exposées. La première modification de C95 était la prise en charge des jeux de caractères internationaux.

    Invoquer le compilateur C avec l’option -std=c99 produit le même effet que définir cette macro.

_ISOC11_SOURCE (depuis la glibc 2.16)
    Exposer des déclarations cohérentes avec la norme ISO C11. La définition de cette macro active également les fonctionnalités C99 et C95 (comme _ISOC99_SOURCE).

    Invoquer le compilateur C avec l’option -std=c11 produit le même effet que définir cette macro.

_LARGEFILE64_SOURCE
    Exposer les définitions pour l'API alternative définie par le LFS (« Large File Summit ») comme une extension de transition pour la « Single UNIX Specification ». Veuillez vous référer à http://opengroup.org/platform/lfs.html. L'API alternative consiste en un jeu de nouveaux objets (c'est-à-dire des fonctions et types) dont le nom est suffixé avec « 64 » (par exemple off64_t pour off_t, lseek64() pour lseek(), etc.). Les nouveaux programmes ne devraient pas utiliser cette macro ; à la place, _FILE_OFFSET_BITS=64 devrait être utilisée.

_LARGEFILE_SOURCE
    Cette macro a historiquement été utilisée pour exposer certaines fonctions (en particulier fseeko() et ftello()) qui contournent les limites d’interfaces de programmation précédentes (feek() et ftell()) qui utilisent long pour les positions de fichier. Cette macro est implicitement définie si _XOPEN_SOURCE est définie avec une valeur supérieure ou égale à 500. Les nouveaux programmes ne devraient pas utiliser cette macro. Définir _XOPEN_SOURCE comme cela vient d’être décrit ou définir _FILE_OFFSET_BITS à la valeur 64 sont les mécanismes préférés pour obtenir le même résultat.

_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. It is also useful when calling functions like copy_file_range(2) that were added more recently and that come only in 64-bit flavors. (Defining this macro permits correctly written programs to use large files with only a recompilation being required.)

    Les systèmes 64 bits permettent d'office d'utiliser des fichiers de taille supérieure à 2 gigaoctets, et sur ces systèmes cette macro n'a aucun effet.

_TIME_BITS
    Defining this macro with the value 64 changes the width of time_t(3type) to 64-bit which allows handling of timestamps beyond 2038. It is closely related to _FILE_OFFSET_BITS and depending on implementation, may require it set. This macro is available as of glibc 2.34.

_BSD_SOURCE (obsolète depuis la glibc 2.20)
    Si cette macro est définie avec n’importe quelle valeur, les définitions héritées de BSD sont exposées par les en-têtes.

    Jusqu’à la glibc 2.18 incluse, les définitions BSD sont préférées dans les situations où les normes sont en conflit, sauf si au moins une des macros _SVID_SOURCE, _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED ou _GNU_SOURCE est définie, auquel cas les définitions BSD sont défavorisées. Depuis la glibc 2.19, _BSD_SOURCE ne force plus la préférence des définitions BSD en cas de conflit.

    Depuis la glibc 2.20, cette macro est obsolète. Sa définition a le même effet que la définition de _DEFAULT_SOURCE, mais génère un avertissement de compilation (à moins que _DEFAULT_SOURCE soit également définie). Utilisez _DEFAULT_SOURCE à la place. Pour permettre au code nécessitant _BSD_SOURCE dans glibc 2.19 et versions antérieures, et _DEFAULT_SOURCE dans glibc 2.20 et version suivantes, de compiler sans avertissement, définissez à la fois _BSD_SOURCE et _DEFAULT_SOURCE.

_SVID_SOURCE (obsolète depuis la glibc 2.20)
    Si cette macro est définie (quelle que soit sa valeur), les en-têtes exposent les définitions héritées de System V. (SVID == System V Interface Definition ; consultez standards(7).)

    Depuis la glibc 2.20, cette macro est obsolète de la même manière que _BSD_SOURCE.

_DEFAULT_SOURCE (depuis la glibc 2.19)
    Cette macro peut être définie pour s’assurer que les définitions par « défaut » sont fournies même si les valeurs par défaut avaient été désactivées, comme cela arrive quand les macros individuelles sont définies explicitement ou quand le compilateur est appelé dans un de ses modes « normalisés » (par exemple cc -std=c99). Définir _DEFAULT_SOURCE n'a aucun effet sans définir d'autres macros individuelles ou invoquer le compilateur dans un de ses modes « normalisés ».

    Les définitions par « défaut » incluent celles requises par POSIX.1-2008 et C99 ISO ainsi que plusieurs définitions dérivées de BSD et System V. Avec la glibc 2.19 et avant, ces définitions par défaut sont à peu près équivalentes à la définition explicite suivante :

        cc -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809

_ATFILE_SOURCE (depuis la glibc 2.4)
    Si cette macro est définie (quelle que soit sa valeur), les en-têtes exposent les définitions d'une série de fonctions avec le suffixe « at » ; consultez openat(2). Depuis glibc 2.10, cette macro est aussi définie de manière implicite si _POSIX_C_SOURCE est définie avec une valeur supérieure ou égale à 200809L.

_GNU_SOURCE
    Définir cette macro (avec n'importe quelle valeur) définit implicitement _ATFILE_SOURCE, _LARGEFILE64_SOURCE, _ISOC99_SOURCE, _XOPEN_SOURCE_EXTENDED, _POSIX_SOURCE, _POSIX_C_SOURCE avec la valeur 200809L (200112L avant la glibc 2.10, 199506L avant la glibc 2.5, 199309L glibc 2.1) et _XOPEN_SOURCE avec la valeur 700 (600 la glibc 2.10, 500 avant la glibc 2.2). De plus, de nombreuses extensions spécifiques GNU sont exposées.

    Depuis la glibc 2.19, définir _GNU_SOURCE provoque la définition implicite de _DEFAULT_SOURCE. Avant la glibc 2.20, définir _GNU_SOURCE provoque la définition implicite de _BSD_SOURCE et _SVID_SOURCE.

_REENTRANT
    Historiquement, dans diverses bibliothèques C il était nécessaire de définir cette macro dans tous les codes multithread (cela peut être encore nécessaire dans quelques bibliothèques C). Dans la glibc, cette macro expose aussi des définitions de certaines fonctions réentrantes.

    Cependant, la glibc est thread-safe par défaut depuis de nombreuses années. Depuis la glibc 2.3, le seul effet de définir _REENTRANT est d’activer une ou deux des mêmes déclarations qui sont activées en définissant _POSIX_C_SOURCE avec une valeur 199606L ou supérieure.

    _REENTRANT est désormais obsolète. Dans la glibc 2.25 et les versions postérieures, définir _REENTRANT est équivalent à définir _POSIX_C_SOURCE avec comme valeur 199606L. Si un niveau de conformité POSIX supérieur est sélectionné par n’importe quel autre moyen (tel que _POSIX_C_SOURCE lui-même, _XOPEN_SOURCE, _DEFAULT_SOURCE ou _GNU_SOURCE), puis définir _REENTRANT n’a aucun effet.

    Cette macro est automatiquement définie si la compilation est faite avec cc -pthread.

_THREAD_SAFE
    Synonyme de _REENTRANT (obsolète), fourni pour la compatibilité avec d'autres implémentations.

_FORTIFY_SOURCE (depuis la glibc 2.3.4)
    Définir cette macro cause certaines vérifications peu poussées d’être réalisées pour détecter quelques dépassements de tampon lors de l’emploi de diverses chaînes et de fonctions de manipulation de mémoire (par exemple, memcpy(3), memset(3), stpcpy(3), strcpy(3), strncpy(3), strcat(3), strncat(3), sprintf(3), snprintf(3), vsprintf(3), vsnprintf(3), gets(3) et les variantes de caractères larges de celles-ci). Pour certaines fonctions, la pertinence de l’argument est vérifiée. Par exemple, une vérification est faite qu’un argument mode soit fourni à open(2) quand les indicateurs indiqués incluent O_CREAT. Tous les problèmes ne sont pas détectés, seulement quelques cas courants.

    Si _FORTIFY_SOURCE est défini à 1, avec un niveau 1 d'optimisation de compilateur (gcc -O1) ou supérieur, des vérifications sans influence sur le comportement de programmes conformes sont faites. Avec _FORTIFY_SOURCE défini à 2, des vérifications supplémentaires sont ajoutées, mais certains programmes conformes peuvent échouer.

    Certaines vérifications peuvent être effectuées lors de la compilation (à l’aide d’une logique de macros implémentés dans les en-têtes) et génèrent des avertissements du compilateur. D'autres vérifications ont lieu à l'exécution et causent une erreur si le test échoue.

    With _FORTIFY_SOURCE set to 3, additional checking is added to intercept some function calls used with an argument of variable size where the compiler can deduce an upper bound for its value. For example, a program where malloc(3)'s size argument is variable can now be fortified.

    Use of this macro requires compiler support, available since gcc 4.0 and clang 2.6. Use of _FORTIFY_SOURCE set to 3 requires gcc 12.0 or later, or clang 9.0 or later, in conjunction with glibc 2.33 or later.

  Définitions par défaut, définitions implicites et combinaison de définitions
Si aucune macro de test de fonctionnalités n'est définie explicitement, alors les macros de test suivantes sont définies par défaut : _BSD_SOURCE (dans la glibc 2.19 et avant), _SVID_SOURCE (dans la glibc 2.19 et avant), _DEFAULT_SOURCE (depuis la glibc 2.19), _POSIX_SOURCE et _POSIX_C_SOURCE=200809L (200112L avant la glibc 2.10, 199506L avant la glibc 2.4, 199309L avant la glibc 2.1).

Si une des macros __STRICT_ANSI__, _ISOC99_SOURCE, _ISOC11_SOURCE (depuis la glibc 2.18) _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED (dans la glibc 2.11 et avant), _BSD_SOURCE (dans la glibc 2.19 et avant) ou _SVID_SOURCE (dans la glibc 2.19 et avant) est définie explicitement, alors _BSD_SOURCE, _SVID_SOURCE et _DEFAULT_SOURCE ne sont pas définies par défaut.

Si ni _POSIX_SOURCE ni _POSIX_C_SOURCE ne sont définies explicitement et que soit __STRICT_ANSI__ n'est pas définie soit _XOPEN_SOURCE est définie à une valeur supérieure ou égale à 500, alors

-   _POSIX_SOURCE est définie à la valeur 1

-   _POSIX_C_SOURCE est définie avec une des valeurs suivantes :

    -   2, si _XOPEN_SOURCE est définie avec une valeur inférieure à 500 ;

    -   199506L, si _XOPEN_SOURCE est définie à une valeur supérieure ou égale à 500 et inférieure à 600, ou

    -   200112L (depuis la glibc 2.4), si _XOPEN_SOURCE est définie à une valeur supérieure ou égale à 600 et inférieure à 700 ;

    -   200809L (depuis la glibc 2.10), si _XOPEN_SOURCE est définie à une valeur supérieure ou égale à 700.

    -   Les versions plus anciennes de la glibc ne connaissent pas les valeurs 200112L et 200809L pour _POSIX_C_SOURCE et la configuration de cette macro dépendra de la version de la glibc.

    -   Si _XOPEN_SOURCE n'est pas défini, alors la configuration de _POSIX_C_SOURCE dépend de la version de la glibc : 199506L avant la glibc 2.4, 200112L de la glibc 2.4 à la glibc 2.9 et 200809L depuis la glibc 2.10.

Plusieurs macros peuvent être définies, les résultats sont additifs.

STANDARDS
POSIX.1 spécifie _POSIX_C_SOURCE, _POSIX_SOURCE et _XOPEN_SOURCE.

_FILE_OFFSET_BITS n’est spécifiée par aucune norme, mais est employée dans quelques autres implémentations.

_BSD_SOURCE, _SVID_SOURCE, _DEFAULT_SOURCE, _ATFILE_SOURCE, _GNU_SOURCE, _FORTIFY_SOURCE, _REENTRANT et _THREAD_SAFE sont spécifiques à la glibc.

HISTORIQUE
_XOPEN_SOURCE_EXTENDED était spécifiée par XPG4v2 (c’est-à-dire SUSv1), mais n’est pas présente dans SUSv2 et les versions suivantes.

NOTES
<features.h> est un fichier d'en-tête spécifique à Linux/glibc. D'autres systèmes ont un fichier similaire, mais typiquement sous un nom différent. Ce fichier est inclus automatiquement par les autres en-têtes si nécessaire : il n'est pas nécessaire de l'inclure explicitement pour utiliser les macros de test de fonctionnalités.

Selon quelles macros de test de fonctionnalités ci-dessus sont définies, <features.h> définit diverses autres macros qui sont testées par les en-têtes de la glibc. Ces macros ont des noms préfixés par deux caractères de soulignement (par exemple __USE_MISC). Les programmes ne doivent jamais définir ces macros directement ; ils doivent utiliser les macros de test de fonctionnalités de la liste précédente.

EXEMPLES
Le programme ci-dessous peut être utilisé pour explorer comment les différentes macros de test de fonctionnalités sont configurées en fonction de la version de la glibc et quelle macros sont explicitement définies. L'exécution qui suit dans un interpréteur de commandes, sur un système avec la glibc 2.10, montre quelques exemples de ce qu'on peut voir :

    $ cc ftm.c
    $ ./a.out
    _POSIX_SOURCE defined
    _POSIX_C_SOURCE defined: 200809L
    _BSD_SOURCE defined
    _SVID_SOURCE defined
    _ATFILE_SOURCE defined
    $ cc -D_XOPEN_SOURCE=500 ftm.c
    $ ./a.out
    _POSIX_SOURCE defined
    _POSIX_C_SOURCE defined: 199506L
    _XOPEN_SOURCE defined: 500
    $ cc -D_GNU_SOURCE ftm.c
    $ ./a.out
    _POSIX_SOURCE defined
    _POSIX_C_SOURCE defined: 200809L
    _ISOC99_SOURCE defined
    _XOPEN_SOURCE defined: 700
    _XOPEN_SOURCE_EXTENDED defined
    _LARGEFILE64_SOURCE defined
    _BSD_SOURCE defined
    _SVID_SOURCE defined
    _ATFILE_SOURCE defined
    _GNU_SOURCE defined

  Source du programme
    /* ftm.c */

    #include <stdint.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>

    int
    main(int argc, char *argv[])
    {
    #ifdef _POSIX_SOURCE
        printf("_POSIX_SOURCE defined\n");
    #endif

    #ifdef _POSIX_C_SOURCE
        printf("_POSIX_C_SOURCE defined: %jdL\n",
                (intmax_t) _POSIX_C_SOURCE);
    #endif

    #ifdef _ISOC99_SOURCE
        printf("_ISOC99_SOURCE defined\n");
    #endif

    #ifdef _ISOC11_SOURCE
        printf("_ISOC11_SOURCE defined\n");
    #endif

    #ifdef _XOPEN_SOURCE
        printf("_XOPEN_SOURCE defined: %d\n", _XOPEN_SOURCE);
    #endif

    #ifdef _XOPEN_SOURCE_EXTENDED
        printf("_XOPEN_SOURCE_EXTENDED defined\n");
    #endif

    #ifdef _LARGEFILE64_SOURCE
        printf("_LARGEFILE64_SOURCE defined\n");
    #endif

    #ifdef _FILE_OFFSET_BITS
        printf("_FILE_OFFSET_BITS defined: %d\n", _FILE_OFFSET_BITS);
    #endif

    #ifdef _TIME_BITS
        printf("_TIME_BITS defined: %d\n", _TIME_BITS);
    #endif

    #ifdef _BSD_SOURCE
        printf("_BSD_SOURCE defined\n");
    #endif

    #ifdef _SVID_SOURCE
        printf("_SVID_SOURCE defined\n");
    #endif

    #ifdef _DEFAULT_SOURCE
        printf("_DEFAULT_SOURCE defined\n");
    #endif

    #ifdef _ATFILE_SOURCE
        printf("_ATFILE_SOURCE defined\n");
    #endif

    #ifdef _GNU_SOURCE
        printf("_GNU_SOURCE defined\n");
    #endif

    #ifdef _REENTRANT
        printf("_REENTRANT defined\n");
    #endif

    #ifdef _THREAD_SAFE
        printf("_THREAD_SAFE defined\n");
    #endif

    #ifdef _FORTIFY_SOURCE
        printf("_FORTIFY_SOURCE defined\n");
    #endif

        exit(EXIT_SUCCESS);
    }

VOIR AUSSI
libc(7), standards(7), system_data_types(7)

La section « Feature Test Macros » de info libc.

/usr/include/features.h

TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 (https://www.gnu.org/licenses/gpl-3.0.html) concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.