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