FEATURE_TEST_MACROS(7)

NOM
feature_test_macros - Macros de test de fonctionnalité

SYNOPSIS
#include <features.h>

DESCRIPTION
Les macros de test de fonctionnalité permettent au programmeur de contrôler les définitions qui seront exposées par les fichiers d'entêtes système lorsqu'un programme est compilé. Cela est utile pour la création d'applications portables, en empêchant les définitions non standard d'être exposées. D'autres macros peuvent être utilisées pour exposer des définitions non standard qui ne le sont pas par défaut. Les effets précis de chacune de ces macros de test de fonctionnalité décrites plus loin peuvent être constatés en inspectant le fichier d'entête <features.h>. Pour quelle soit effective, une macro de test de fonctionnalité doit être définie avant l'inclusion de tout autre fichier d'entête. Cela peut être fait soit dans la commande de compilation (cc -DMACRO=valeur), soit en définissant la macro dans le code source avant d'inclure les entêtes.

  Spécification d'exigences de macros de test de fonctionnalités dans les pages de manuels
Lorsqu'une fonction a besoin que soit définie une macro de test de fonctionnalité, le SYNOPSIS de la page de manuel inclut une note de la forme suivante (cet exemple est extrait de la page de chmod(2)

    #include <sys/stat.h>

    int chmod(const char *path, mode_t mode);
    int fchmod(int fd, mode_t mode);

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

    fchmod(): _BSD_SOURCE || _XOPEN_SOURCE >= 500

Le || signifie que pour obtenir la déclaration de fchmod(2) à partir de <sys/stat.h>, l'une des définitions de macro suivantes doit être faite avant d'inclure tout fichier d'entêtes :
    #define _BSD_SOURCE
    #define _XOPEN_SOURCE 500     /* Ou toute valeur > 500 */

De manière alternative, des définitions équivalentes peuvent être incluses sur la ligne de commande de compilation :
    cc -D_BSD_SOURCE
    cc -D_XOPEN_SOURCE=500        # Ou toute valeur > 500

Veuillez noter que, comme décrit plus loin, certaines macros de test de fonctionnalités sont définies par défaut, aussi, il n'est pas toujours nécessaire de spécifier explicitement la (les) macro(s) de test de fonctionnalités indiquée(s) dans le SYNOPSIS. Dans quelques cas, les pages de manuel utilisent un raccourci pour exprimer les exigences de macros de tests de fonctionnalité (cet exemple est extrait de la page readahead(2)):
    #define _GNU_SOURCE
    #include <fcntl.h>

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

Ce format est utilisé dans les cas où une seule macro de test de fonctionnalité est utilisée pour exposer la déclaration de la fonction, et que la macro n'est pas définie par défaut.

  Macros de test de fonctionnalités reconnues par la glibc
Les paragraphes suivants expliquent comment les macros de test de fonctionnalités sont gérées par les glibc 2.x Linux, x > 0. La glibc Linux reconnaît les macros de test de fonctionnalités suivantes :

__STRICT_ANSI__
    ISO Standard C. Cette macro est implicitement définie par gcc(1) lorsqu'il est invoqué, par exemple, avec l'option -std=c99 ou l'option -ansi.

_POSIX_C_SOURCE
    Définir cette macro fait que les fichiers d'entêtes exposeront les définitions comme suit :

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

    •   La valeur 2 ou supérieur expose en plus les définitions pour POSIX.2-1992.

    •   La valeur 199309L ou supérieur expose en plus les définitions POSIX.1b (extensions temps réel).

    •   La valeur 199506L ou supérieur expose en plus les définitions pour POSIX.1c (threads).

    •   (Depuis la glibc 2.3.3) La valeur 200112L ou supérieur expose en plus les définitions correspondant à la spécification de base de POSIX.1-2001 (excluant l'extension XSI).

_POSIX_C_SOURCE
    Définir cette macro obsolète avec n'importe quelle valeur est équivalent à définir _POSIX_SOURCE à une valeur de 1.

_XOPEN_SOURCE
    Définir cette macro fera que les fichiers d'entêtes exposeront les définitions comme suit :

    •   La définir avec n'importe quelle valeur exposera les définitions conformes à POSIX.1, POSIX.2 et XPG4.

    •   La définir avec la valeur 500 ou plus exposera en plus les définitions pour SUSv2 (UNIX 98).

    •   (Depuis la glibc 2.2) La définir avec la valeur 600 ou plus exposera en plus les définitions pour SUSv3 (UNIX 03 ; c'est-à-dire, la spécification de base POSIX.1-2001 plus l'extension XSI) et les définitions C99.

_XOPEN_SOURCE_EXTENDED
    Si cette macro est définie et que _XOPEN_SOURCE est définie, cela exposera les définitions correspondant aux extensions UNIX (UNIX 95) XPG4v2 (SUSv1). Cette macro est également implicitement définie si _XOPEN_SOURCE est définie avec une valeur de 500 ou plus.

_ISOC99_SOURCE
    Exposer les extensions C99 de ISO C (1990). Cette macro est reconnue depuis la glibc 2.1.3 ; les versions de la glibc antérieures à la 2.1.x reconnaissaient une macro équivalente qui s'appelait _ISOC9X_SOURCE (parce que la norme C99 ne l'a jamais finalisée). Aussi, l'utilisation de cette dernière macro est obsolète. La glibc continue toutefois de la reconnaître pour des raisons de rétro-compatibilité.

_LARGEFILE64_SOURCE
    Exposer les définitions pour l'API alternative spécifiée par LFS (Large File Summit) comme une « extention transitionnelle » les « Single UNIX Specification ». (Voir http://opengroup.org/platform/lfs.html.) L'API alternative consiste en un ensemble de nouveaux objets (c'est-à-dire, des fonctions et des types) dont les noms sont suffixés avec « 64 » (par exemple, (e.g., off64_t versus off_t, lseek64() versus lseek(), etc.). Les nouveaux programmes ne doivent par utiliser cette interface ; ils doivent utiliser _FILE_OFFSET_BITS=64 à la place.

_FILE_OFFSET_BITS
    Définir cette macro avec la valeur 64 convertira automatiquement les références aux fonctions 32 bits et aux types de données relatives aux entrées-sorties de fichiers et aux opérations sur le système de fichiers en leurs équivalents 64 bits. Cela est utile pour effectuer des entrées-sorties sur de gros fichiers (> 2 gigaoctets) sur des systèmes 32 bits. (Définir cette macro permet aux programes correctement écrits, manipulant de gros fichiers, de n'avoir besoin que d'une recompilation.) Les systèmes 64 bits permettent naturellement des tailles de fichiers supérieures à 2 gigaoctets, et sur de tels systèmes, cette macro n'a aucun effet.

_BSD_SOURCE
    Définir cette macro avec n'importe quelle valeur fera que les fichiers d'entêtes exposeront les définitions dérivées de BSD. Définir cette macro fera aussi que les définitions BSD seront préférées dans les situations où les normes sont en conflit, à moins qu'une ou plusieurs parmi _SVID_SOURCE, _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED ou _GNU_SOURCE soit définie, auquel cas les définitions BSD sont défavorisées.

_SVID_SOURCE
    Définir cette macro avec n'importe quelle valeur fera que les fichiers d'entêtes exposeront les définitions dérivées de System V. (SVID == System V Interface Definition ; standards(7).)

_ATFILE_SOURCE (depuis la glibc 2.4)
    Définir cette macro avec n'importe quelle valeur fera que les fichiers d'entêtes exposeront les déclarations d'un ensemble de fonctions suffixées avec « at » ; voir openat(2).

_GNU_SOURCE
    Définir cette macro avec n'importe quelle valeur est équivalent à définir _BSD_SOURCE, _SVID_SOURCE, _ATFILE_SOURCE, _LARGEFILE64_SOURCE, _ISOC99_SOURCE, _XOPEN_SOURCE_EXTENDED, _POSIX_SOURCE, _POSIX_C_SOURCE avec la valeur 200112L (199506L dans les versions de la glibc avant 2.5), et _XOPEN_SOURCE avec la valeur 600 (500 dans les versions de la glibc avant 2.2). De plus, diverses extensions spécifiques GNU seront également exposées.

_REENTRANT
    Définir cette macro expose les définitions de certaines fonctions réentrantes. Pour les programmes multithreadés, utilisez cc -pthread à la place.

_THREAD_SAFE
    Synonyme de _REENTRANT, fourni pour compatibilité avec quelques autres implémentations.

_FORTIFY_SOURCE (depuis la glibc 2.3.4)
    Définir cette macro déclenche certaines vérifications peu couteuses pour détecter certaines erreurs de débordements de tampon lors de l'utilisation de diverses fonctions de manipulation de chaînes et de mémoire. Tous les débordements de tampon ne sont pas détectés, juste dans certains cas fréquents. Dans l'implémentation actuelle, des vérifications sont ajoutées pour les appels à 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), et gets(3). Si _FORTIFY_SOURCE est définie à 1, avec une optimisation de compilation de niveau 1 (gcc -O1) ou plus, vérifie que cela ne modifie pas le comportement des programmmes conformes. Avec _FORTIFY_SOURCE définie à 2, des vérifications supplémentaires sont ajoutées mais certains programmes conformes peuvent échoués. Certaines des vérifications peuvent être effectuées à la compilation et générent des avertissements de la part du compilateur ; d'autres auront lieu à l'exécution et provoqueront une erreur d'exécution si la vérification échoue. L'utilisation de cette macro nécessite une prise en charge par le compilateur disponible dans gcc(1) depuis la version 4.0.

  Définitions par défaut, définitions implicites et combinaison de définitions

Si aucune macro de test de fonctionnalités n'est explicitement définie, les macros suivantes sont définies par défaut : _BSD_SOURCE, _SVID_SOURCE, _POSIX_SOURCE et _POSIX_C_SOURCE=200112L. (199506L dans les versions de la glibc avant 2.4)

Si l'une parmi __STRICT_ANSI__, _ISOC99_SOURCE, _POSIX_SOURCE, _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, _BSD_SOURCE ou _SVID_SOURCE est explicitement définie, _BSD_SOURCE, et _SVID_SOURCE ne sont pas définies par défaut. SI _POSIX_SOURCE et _POSIX_C_SOURCE ne sont pas explicitement définies, et si __STRICT_ANSI__ ou _XOPEN_SOURCE n'est pas définie avec une valeur de 500 ou plus, alors

    *   _POSIX_SOURCE est définie avec une valeur de 1 ; et

    *   _POSIX_C_SOURCE est définie avec l'une des valeurs suivantes :

        •   2, si XOPEN_SOURCE est définie avec une valeur inférieure à 500 ;

        •   199506L, si XOPEN_SOURCE est définie avec une valeur supérieur ou égale à 500 et inférieure à 600 ; ou

        •   200112L (199506L dans les versions de la glibc avant 2.4), si XOPEN_SOURCE n'est pas définie ou est définie avec une valeur supérieure ou égale à 600.

Plusieurs macros peuvent être définies ; les résultats s'additionnent.

CONFORMITÉ
POSIX.1 spécifie _POSIX_C_SOURCE, _POSIX_SOURCE et _XOPEN_SOURCE. _XOPEN_SOURCE_EXTENDED était spécifiée par XPG4v2 (aka SUSv1). _FILE_OFFSET_BITS n'est spécifiée par aucune norme mais est employée dans quelques autres implémentations. _BSD_SOURCE, _SVID_SOURCE, _GNU_SOURCE, _FORTIFY_SOURCE, _REENTRANT et _THREAD_SAFE sont spécifiques à Linux (glibc).

NOTES
<features.h> est un fichier d'entête spécifique à Linux/glibc. D'autres systèmes ont un fichier analogue mais avec un nom différent. Ce fichier d'entête est automatiquement inclus par d'autres fichiers d'entêtes comme nécessaire : il n'est donc pas nécessaire de l'inclure explicitement pour pouvoir utiliser les macros de test de fonctionnalité. Selon quelles macros de test de fonctionnalité parmi les précédentes sont définies, <features.h> définit de manière interne diverses autres macros qui sont vérifiées par d'autres fichiers d'entêtes de la glibc. Ces macros ont des noms préfixés par deux caractères « soulignement » (par exemple : __USE_MISC). Les programmes ne doivent jamais définir ces macros directement : ils doivent à la place utiliser la (les) macro(s) de test de fonctionnalité de la liste précédente.

VOIR AUSSI
standards(7)

La section « Feature Test Macros » de info libc.

/usr/include/features.h

TRADUCTION

Ce document est une traduction réalisée par Alain Portal <aportal AT univ-montp2 DOT fr> le 4 août 2006 et révisée le 17 juillet 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 7 feature_test_macros ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.