1. NOM

feature_test_macros - Macros de test de fonctionnalités

2. SYNOPSIS

 
Sélectionnez
#include <features.h>

3. 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(hytêtes système lorsqu'un programme est compilé. NOTE : pour avoir un effet, une macro de test de fonctionnalité doit être définie avant d'inclure tout fichier d'en(hytê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(hytête. 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(hydessous peuvent être vérifiés en inspectant le fichier d'en(hytête <features.h>

3.1. 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 acct(2)) :
        

#include <unistd.h>

int acct(const char *filename);

 
Sélectionnez
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 :

 
Sélectionnez
#define _BSD_SOURCE
#define _XOPEN_SOURCE        /* ou toute valeur < 500 */

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

 
Sélectionnez
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é 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)) :

 
Sélectionnez
#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.

3.2. 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__
        La norme 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 :

3 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 :

3 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.
  • _ISOC95_SOURCE
        Exposer les définitions du premier amendement au C ISO (1990) (aussi appelé C95). Cette macro est reconnue depuis la glibc 2.12. La première modification de C95 était la prise en charge des jeux de caractères internationaux. Les modifications de C95 ont été intégrées à la norme C99 qui a suivi (autrement dit, _ISOC99_SOURCE implique _ISOC95_SOURCE).
  • _ISOC99_SOURCE
        Exposer 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 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.
  • _ISOC11_SOURCE
        Exposer des déclarations cohérentes avec la norme ISO C11. Cette macro est reconnue depuis glibc 2.16.
  • _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 fichiers 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(hytê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(hytê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). 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) 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 normes 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.

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

* 3 _POSIX_SOURCE est définie à la valeur 1 ; et

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

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

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

5. NOTES

<features.h> est un fichier d'en(hytê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(hytê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(hydessus sont définies, <features.h> définit diverses autres macros qui sont testées par les en(hytê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.

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

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

6.1. Source du programme

 
Sélectionnez
/* ftm.c */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
#ifdef _POSIX_SOURCE
    printf("_POSIX_SOURCE définie\n");
#endif
#ifdef _POSIX_C_SOURCE
    printf("_POSIX_C_SOURCE définie : %ldL\n", (long) _POSIX_C_SOURCE);
#endif
#ifdef _ISOC99_SOURCE
    printf("_ISOC99_SOURCE définie\n");
#endif
#ifdef _XOPEN_SOURCE
    printf("_XOPEN_SOURCE définie : %d\n", _XOPEN_SOURCE);
#endif
#ifdef _XOPEN_SOURCE_EXTENDED
    printf("_XOPEN_SOURCE_EXTENDED définie\n");
#endif
#ifdef _LARGEFILE64_SOURCE
    printf("_LARGEFILE64_SOURCE définie\n");
#endif
#ifdef _FILE_OFFSET_BITS
    printf("_FILE_OFFSET_BITS définie : %d\n", _FILE_OFFSET_BITS);
#endif
#ifdef _BSD_SOURCE
    printf("_BSD_SOURCE définie\n");
#endif
#ifdef _SVID_SOURCE
    printf("_SVID_SOURCE définie\n");
#endif
#ifdef _ATFILE_SOURCE
    printf("_ATFILE_SOURCE définie\n");
#endif
#ifdef _GNU_SOURCE
    printf("_GNU_SOURCE définie\n");
#endif
#ifdef _REENTRANT
    printf("_REENTRANT définie\n");
#endif
#ifdef _THREAD_SAFE
    printf("_THREAD_SAFE définie\n");
#endif
#ifdef _FORTIFY_SOURCE
    printf("_FORTIFY_SOURCE définie\n");
#endif
    exit(EXIT_SUCCESS);
}

7. VOIR AUSSI

libc(7), standards(7) La section « Feature Test Macros » de info libc. /usr/include/features.h

8. COLOPHON

Cette page fait partie de la publication 3.52 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/.

9. TRADUCTION

Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

Julien Cristau et l'équipe francophone de traduction de Debian (2006-2009).

Veuillez signaler toute erreur de traduction en écrivant à < >.

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