Loading

NOM

       feature_test_macros - Macros de test de fonctionnalités

SYNOPSIS

       #include <features.h>

       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é.  Cela peut être utile pour
       créer des applications  standard,  en  empêchant  des  définitions  non
       standard  d’être  exposées. D’autres macros peuvent être utilisées pour
       exposer des définitions non standard  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>

       Pour avoir un effet, une macro de  test  de  fonctionnalité  doit  tre
       dfinie avant dinclure tout fichier dentte. 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.

   Spécification des exigences de macro de test  de  fonctionnalité  dans  les
       pages de manuel
       Quand  une  fonction  nécessite  qu’une macro de test de fonctionnalité
       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 chmod(2)) :

              #include <sys/stat.h>

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

          Feature    Test    Macro     Requirements     for     glibc     (see
          feature_test_macros(7)):
          (C’est-à-dire :  « Exigences  de  macros  de test de fonctionnalités
          pour la glibc (voir feature_test_macros(7)) : »)

              fchmod() : _BSD_SOURCE || _XOPEN_SOURCE >= 500

       Les doubles barres || signifies qua  pour  obtenir  la  déclaration  de
       fchmod(2)  depuis <sys/stat.h>, une des définitions de macros doit être
       utilisée avant d’inclure les fichier d’en-tête :

              #define _BSD_SOURCE
              #define _XOPEN_SOURCE 500     /* ou toute valeur > 500 */

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

              cc -D_BSD_SOURCE
              cc -D_XOPEN_SOURCE=500        # Ou toute valeur > 500

       Veuillez  noter  que, comme décrit ci-dessous, certaines macros de test
       de fonctionnalité 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
              #include <fcntl.h>

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

       Ce format est utilisé dans les cas  où  seule  une  macro  de  test  de
       fonctionnalité  peut  être  utilisée  pour exposer la déclaration de la
       fonction et quand cette macro n’est pas définie par défaut.

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

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

       __STRICT_ANSI__
              Le standard C ISO. Cette macro  est  définie  implicitement  par
              gcc(1)  lors  des appels avec, par exemple, l’option -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  avec
                 POSIX.1-1990 et le 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  les  définitions  correspondantes   à   la
                 spécification de base POSIX.1-2001 (sans l’extension XSI).

              ·  (Depuis  la  glibc  2.10) Les valeurs supérieures ou égales à
                 200809L  exposent  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.

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

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

              ·  (Depuis la glibc 2.2) Les valeurs supérieures ou égales à 600
                 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 sont exposées en plus des précédentes.

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

       _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) Cette macro est  également  définie  implicitement  si
              _XOPEN_SOURCE  est définie avec une valeur supérieure ou égale à
              500.

       _ISOC99_SOURCE
              Expose les extensions C99 du  C  ISO  (1990).  Cette  macro  est
              reconnue  depuis la glibc 2.1.3 ; les versions antérieures de la
              glibc  2.1.x  reconnaissaient  une  macro   équivalent   appelée
              _ISOC9X_SOURCE (parce que le standard C99 n’était pas finalisé).
              Même si l’utilisation de cette dernière macro est  à  proscrire,
              la   glibc  continue  à  la  reconnaître  pour  des  raisons  de
              compatibilité descendante.

       _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  en  suffixé de « 64 » (par
              exemple off64_t pour off_t, lseek64() pour lseek(),  etc.).  Les
              nouveaux programmes ne devraient pas utiliser ces interfaces ; à
              la place, _FILE_OFFSET_BITS=64 devrait être utilisée.

       _FILE_OFFSET_BITS
              Définir cette macro à la valeur 64 convertit automatiquement les
              références  aux  fonctions  et types de données 32 bits liés aux
              E/S sur les  fichiers  et  aux  opérations  sur  le  système  de
              fichiers  en références à leurs équivalents 64 bits. C’est utile
              pour les E/S sur des gros fichiers  (>  2  Gigaoctets)  sur  les
              systèmes 32 bits. Cette macro permet aux programmes correctement
              écrits  d’utiliser  de   gros   fichier   avec   seulement   une
              recompilation.   Les   systèmes   64 bits   permettent  d’office
              d’utiliser des fichiers de taille supérieure à 2 Gigaoctets,  et
              sur ces système cette macro n’a aucun effet.

       _BSD_SOURCE
              Si cette macro est définie, les définitions héritées de BSD sont
              exposées par les en‐têtes. De plus,  les  définitions  BSD  sont
              préférées  dans  les situations où les normes sont en conflit, à
              moins qu’une (ou plus) des macros  _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
              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).)

       _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  fonction  avec
              le suffixe « at » ; consultez 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  200809L  (200112L
              dans  les versions de la glibc antérieures à 2.10 ; 199506L dans
              les versions de la glibc antérieures à 2.5 ;  199309L  dans  les
              versions  de  la glibc antérieures à 2.1), et _XOPEN_SOURCE avec
              la valeur 700 (600 dans les versions de la glibc  antérieures  à
              2.10 ;  500 dans les versions de la glibc antérieures à 2.2). De
              plus, de nombreuses extensions spécifiques  GNU  sont  exposées.
              Quand  les  standards  se contredisent, les définitions BSD sont
              les moins prioritaires.

       _REENTRANT
              Définir  cette  macro  rend  accessibles  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  la  compatibilité  avec
              d’autres implémentations.

       _FORTIFY_SOURCE (depuis la glibc 2.3.4)
              Définir  cette  macro  active  certains  tests  peu coûteux pour
              détecter  certains  dépassements  de   tampons   dans   diverses
              fonctions  de  manipulation  de  chaînes ou de mémoire. Tous les
              dépassements de tampons ne sont pas  détectés,  mais  uniquement
              certains  cas  fréquents.  Actuellement,  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éfini à 1, avec un niveau
              d’optimisation de 1 ou plus (gcc -O1),  des  vérifications  sans
              influence  sur  le  comportement  des  programmes  corrects 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  à  la  compilation et génèrent des avertissements du
              compilateur ; d’autres ont lieu à  l’exécution  et  causent  une
              erreur si le test échoue. L’utilisation de cette macro nécessite
              une gestion par le compilateur, qui est 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é n’est définie  explicitement,
       alors   les  macros  de  test  suivantes  sont  définies  par  défaut :
       _BSD_SOURCE,  _SVID_SOURCE,  _POSIX_SOURCE  et  _POSIX_C_SOURCE=200809L
       (200112L  dans  les  versions  de la glibc antérieures à 2.10 ; 199506L
       dans les versions de la glibc antérieures  à  2.4 ;  199309L  dans  les
       versions de la glibc antérieures à ).

       Si  une  des  macros  __STRICT_ANSI__,  _ISOC99_SOURCE,  _POSIX_SOURCE,
       _POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, _BSD_SOURCE  ou
       _SVID_SOURCE   est   définie   explicitement,   alors   _BSD_SOURCE  et
       _SVID_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 ; et

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

                ·  (Depuis la glibc 2.4) 200112L, si XOPEN_SOURCE est  définie
                   à une valeur supérieure ou égale à 600 et inférieure à 700.

                ·  (Depuis la glibc 2.10) 200809L, 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 pour les version de la glibc  antérieures  à  2.4 ;
                   200112L  pour  les  glibc  2.4 à 2.9 ; et 200809L depuis la
                   glibc 2.10.

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

CONFORMITÉ

       POSIX.1  spécifie  _POSIX_C_SOURCE,  _POSIX_SOURCE  et   _XOPEN_SOURCE.
       _XOPEN_SOURCE_EXTENDED est spécifiée par XPG4v2 (alias SUSv1).

       _FILE_OFFSET_BITS  n’est  spécifiée par aucune norme, mais est utilisée
       par d’autres implémentations.

       _BSD_SOURCE,      _SVID_SOURCE,      _ATFILE_SOURCE,       _GNU_SOURCE,
       _FORTIFY_SOURCE,  _REENTRANT  et  _THREAD_SAFE sont spécifiques à Linux
       (glibc).

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

       Selon quelles macros de test de fonctionnalité 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  underscore  (par  exemple  __USE_MISC).  Les  programmes ne
       doivent jamais définir ces macros directement ;  ils  doivent  utiliser
       les macros de test de fonctionnalité de la liste précédente.

EXEMPLE

       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 <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: %ldL\n", (long) _POSIX_C_SOURCE);
       #endif

       #ifdef _ISOC99_SOURCE
           printf("_ISOC99_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 _BSD_SOURCE
           printf("_BSD_SOURCE defined\n");
       #endif

       #ifdef _SVID_SOURCE
           printf("_SVID_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)

       La section « Feature Test Macros » de info libc.

       /usr/include/features.h

COLOPHON

       Cette page fait partie de  la  publication  3.23  du  projet  man-pages
       Linux.  Une description du projet et des instructions pour signaler des
       anomalies      peuvent      être       trouvées       à       l’adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Cette page de manuel a été traduite et est maintenue par Julien Cristau
       <julien.cristau@ens-lyon.org> et l’équipe francophone de traduction  de
       Debian.

       Veuillez   signaler   toute   erreur   de   traduction  en  écrivant  à
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous  pouvez  toujours avoir accès à la version anglaise de ce document
       en utilisant la commande « man -L C <section> <page_de_man> ».