Provided by:
manpages-fr_3.32d0.2p4-1_all 
NOM
feature_test_macros - Macros de test de fonctionnalites
SYNOPSIS
#include <features.h>
DESCRIPTION
Les macros de test de fonctionnalites permettent au programmeur de
controler quelles definitions sont exposees par les fichiers d'en-tetes
systeme lorsqu'un programme est compile.
NOTE : pour avoir un effet, une macro de test de fonctionnalite doit
^etre d'efinie avant d'inclure tout fichier d'en-t^ete. Cela peut etre
accompli soit dans la ligne de commande de compilation (cc
-DMACRO=valeur), soit en definissant la macro dans le code source avant
d'inclure tout en-tete.
Certaines macros de test de fonctionnalites sont utiles pour creer des
applications portables, en empechant des definitions non normalisees
d'etre exposees. D'autres macros peuvent etre utilisees pour exposer
des definitions non normalisees qui ne sont pas exposees par defaut.
Les effets precis de chacune des macros decrites ci-dessous peuvent
etre verifies en inspectant le fichier d'en-tete <features.h>
Sp'ecification des exigences de macro de test de fonctionnalit'e dans les
pages de manuel
Quand une fonction necessite qu'une macro de test de fonctionnalite
soit definie, la section SYNOPSIS de la page de manuel comprend
generalement une note de la forme suivante (exemple pris dans la page
de manuel acct(2)) :
#include <unistd.h>
int acct(const char *filename);
Exigences de macros de test de fonctionnalites pour
la glibc (consultez feature_test_macros(7)) :
acct() : _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500)
Les doubles barres || signifies qua pour obtenir la declaration de
acct(2) depuis <unistd.h>, une des definitions de macros doit etre
utilisee avant d'inclure les fichiers d'en-tete :
#define _BSD_SOURCE
#define _XOPEN_SOURCE /* ou toute valeur < 500 */
Autrement, les definitions equivalentes peuvent etre faites lors de
l'appel au compilateur :
cc -D_BSD_SOURCE
cc -D_XOPEN_SOURCE # Ou toute valeur < 500
Veuillez noter que, comme decrit ci-dessous, certaines macros de test
de fonctionnalit'e sont d'efinies par d'efaut, et il n'est donc pas
toujours necessaire de specifier explicitement les macros indiquees
dans le SYNOPSIS.
Dans certains cas, les pages de manuel utilisent des raccourcis pour
exprimer la necessite de certaines macros de test (exemple tire de
readahead(2)) :
#define _GNU_SOURCE
#include <fcntl.h>
ssize_t readahead(int fd, off64_t *offset, size_t count);
Ce format est utilise dans les cas ou seule une macro de test de
fonctionnalite peut etre utilisee pour exposer la declaration de la
fonction et quand cette macro n'est pas definie par defaut.
Macros de test de fonctionnalit'es comprises par la glibc
Les paragraphes suivants expliquent comment les macros de test de
fonctionnalite sont gerees les glibc Linux 2.x, x > 0.
La glibc de Linux comprend les macros de test de fonctionnalite
suivantes :
__STRICT_ANSI__
La norme C ISO. Cette macro est definie implicitement par gcc(1)
lors des appels avec, par exemple, l'option -std=c99 ou -ansi.
_POSIX_C_SOURCE
Si cette macro est definie, les en-tetes exposent les
definitions suivantes :
o La valeur 1 expose les definitions conformes avec
POSIX.1-1990 et le C ISO (1990).
o Les valeurs superieures ou egales a 2 exposent en plus les
definitions de POSIX.2-1992.
o Les valeurs superieures ou egales a 199309L exposent en plus
les definitions de POSIX.1b (extensions temps-reel).
o Les valeurs superieures ou egales a 199506L exposent en plus
les definitions de POSIX.1c (threads).
o (Depuis la glibc 2.3.3) Les valeurs superieures ou egales a
200112L exposent les definitions correspondantes a la
specification de base POSIX.1-2001 (sans l'extension XSI).
o (Depuis la glibc 2.10) Les valeurs superieures ou egales a
200809L exposent les definitions correspondantes a la
specification de base POSIX.1-2008 (sans l'extension XSI).
_POSIX_SOURCE
Definir cette macro obsolete (quelle que soit sa valeur) est
equivalent a definir _POSIX_C_SOURCE a la valeur 1.
_XOPEN_SOURCE
Si cette macro est definie, les en-tetes exposent les
definitions suivantes :
o Si elle est definie, quelle que soit sa valeur, les
definitions de POSIX.1, POSIX.2 et XPG4 sont fournies.
o Les valeurs superieures ou egales a 500 fournissent les
definitions de SUSv2 (UNIX 98).
o (Depuis la glibc 2.2) Les valeurs superieures ou egales a 600
les definitions de SUSv3 (UNIX 03, c'est-a-dire la
specification de base POSIX.1-2001 plus l'extension XSI) et
de C99 sont exposees en plus des precedentes.
o (Depuis la glibc 2.10) Les valeurs superieures ou egales a
700 exposents les definitions de SUSv4 (c'est-a-dire la
specification de base POSIX.1-2008 plus l'extension XSI).
_XOPEN_SOURCE_EXTENDED
Si cette macro et _XOPEN_SOURCE sont definies, exposer les
definitions correspondant aux extensions XPG4v2 (SUSv1) d'UNIX
(UNIX 95) Cette macro est egalement definie implicitement si
_XOPEN_SOURCE est definie avec une valeur superieure ou egale a
500.
_ISOC99_SOURCE
Exposer les extensions C99 du C ISO (1990). Cette macro est
reconnue depuis la glibc 2.1.3 ; les versions anterieures de la
glibc 2.1.x reconnaissaient une macro equivalent appelee
_ISOC9X_SOURCE (parce que la norme C99 n'etait pas finalisee).
Meme si l'utilisation de cette derniere macro est a proscrire,
la glibc continue a la reconnaitre pour des raisons de
compatibilite ascendante.
_LARGEFILE64_SOURCE
Exposer les definitions pour l'API alternative definie par le
LFS (<< Large File Summit >>) comme une extension de transition
pour la << Single UNIX Specification >>. Veuillez vous referer a
http://opengroup.org/platform/lfs.html. L'API alternative
consiste en un jeu de nouveaux objets (c'est-a-dire des
fonctions et types) dont le nom en suffixe de << 64 >> (par
exemple off64_t pour off_t, lseek64() pour lseek(), etc.). Les
nouveaux programmes ne devraient pas utiliser ces interfaces ; a
la place, _FILE_OFFSET_BITS=64 devrait etre utilisee.
_FILE_OFFSET_BITS
Definir cette macro a la valeur 64 convertit automatiquement les
references aux fonctions et types de donnees 32 bits lies aux
E/S sur les fichiers et aux operations sur le systeme de
fichiers en references a leurs equivalents 64 bits. C'est utile
pour les E/S sur des gros fichiers (> 2 gigaoctets) sur les
systemes 32 bits. Cette macro permet aux programmes correctement
ecrits d'utiliser de gros fichiers avec seulement une
recompilation. Les systemes 64 bits permettent d'office
d'utiliser des fichiers de taille superieure a 2 gigaoctets, et
sur ces systeme cette macro n'a aucun effet.
_BSD_SOURCE
Si cette macro est definie, les definitions heritees de BSD sont
exposees par les en-tetes. De plus, les definitions BSD sont
preferees dans les situations ou les normes sont en conflit, a
moins qu'une (ou plus) des macros _SVID_SOURCE, _POSIX_SOURCE,
_POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED ou
_GNU_SOURCE soit definie, auquel cas les definitions BSD sont
defavorisees.
_SVID_SOURCE
Si cette macro est definie (quelle que soit sa valeur), les en-
tetes exposent les definitions heritees de System V. (SVID ==
System V Interface Definition ; consultez standards(7).)
_ATFILE_SOURCE (depuis la glibc 2.4)
Si cette macro est definie (quelle que soit sa valeur), les
en-tetes exposent les definitions d'une serie de fonction avec
le suffixe << at >> ; consultez openat(2). Depuis glibc 2.10,
cette macro est aussi definie de maniere implicite si
_POSIX_C_SOURCE est definie avec une valeur superieure ou egale
a 200809L.
_GNU_SOURCE
Definir cette macro (avec n'importe quelle valeur) est
equivalent a definir _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 anterieures a 2.10 ; 199506L dans
les versions de la glibc anterieures a 2.5 ; 199309L dans les
versions de la glibc anterieures a 2.1), et _XOPEN_SOURCE avec
la valeur 700 (600 dans les versions de la glibc anterieures a
2.10 ; 500 dans les versions de la glibc anterieures a 2.2). De
plus, de nombreuses extensions specifiques GNU sont exposees.
Quand les normes se contredisent, les definitions BSD sont les
moins prioritaires.
_REENTRANT
Definir cette macro rend accessibles les definitions de
certaines fonctions reentrantes. Pour les programmes
multithreades, utilisez cc -pthread a la place.
_THREAD_SAFE
Synonyme de _REENTRANT, fourni pour la compatibilite avec
d'autres implementations.
_FORTIFY_SOURCE (depuis la glibc 2.3.4)
Definir cette macro active certains tests peu couteux pour
detecter certains depassements de tampons dans diverses
fonctions de manipulation de chaines ou de memoire. Tous les
depassements de tampons ne sont pas detectes, mais uniquement
certains cas frequents. Actuellement, des verifications sont
ajoutees pour les appels a 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 defini a 1, avec un niveau
d'optimisation de 1 ou plus (gcc -O1), des verifications sans
influence sur le comportement des programmes corrects sont
faites. Avec _FORTIFY_SOURCE defini a 2, des verifications
supplementaires sont ajoutees, mais certains programmes
conformes peuvent echouer. Certaines verifications peuvent etre
effectuees a la compilation et generent des avertissements du
compilateur ; d'autres ont lieu a l'execution et causent une
erreur si le test echoue. L'utilisation de cette macro necessite
une gestion par le compilateur, qui est disponible dans gcc(1)
depuis la version 4.0.
D'efinitions par d'efaut, d'efinitions implicites et combinaison de
d'efinitions
Si aucune macro de test de fonctionnalite n'est definie explicitement,
alors les macros de test suivantes sont definies par defaut :
_BSD_SOURCE, _SVID_SOURCE, _POSIX_SOURCE et _POSIX_C_SOURCE=200809L
(200112L dans les versions de la glibc anterieures a 2.10 ; 199506L
dans les versions de la glibc anterieures a 2.4 ; 199309L dans les
versions de la glibc anterieures a ).
Si une des macros __STRICT_ANSI__, _ISOC99_SOURCE, _POSIX_SOURCE,
_POSIX_C_SOURCE, _XOPEN_SOURCE, _XOPEN_SOURCE_EXTENDED, _BSD_SOURCE ou
_SVID_SOURCE est definie explicitement, alors _BSD_SOURCE et
_SVID_SOURCE ne sont pas definies par defaut.
Si ni _POSIX_SOURCE ni _POSIX_C_SOURCE ne sont definies explicitement
et que soit __STRICT_ANSI__ n'est pas definie soit _XOPEN_SOURCE est
definie a une valeur superieure ou egale a 500, alors
* _POSIX_SOURCE est definie a la valeur 1 ; et
* _POSIX_C_SOURCE est definie avec une des valeurs suivantes :
o 2, si XOPEN_SOURCE est definie avec une valeur inferieure a
500 ;
o 199506L, si XOPEN_SOURCE est definie a une valeur
superieure ou egale a 500 et inferieure a 600 ; ou
o (Depuis la glibc 2.4) 200112L, si XOPEN_SOURCE est definie
a une valeur superieure ou egale a 600 et inferieure a 700.
o (Depuis la glibc 2.10) 200809L, si XOPEN_SOURCE est definie
a une valeur superieure ou egale a 700.
o 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 dependra de la version de la
glibc.
o Si _XOPEN_SOURCE n'est pas defini, alors la configuration
de _POSIX_C_SOURCE depend de la version de la glibc :
199506L pour les version de la glibc anterieures a 2.4 ;
200112L pour les glibc 2.4 a 2.9 ; et 200809L depuis la
glibc 2.10.
Plusieurs macros peuvent etre definies ; les resultats sont additifs.
CONFORMIT'E
POSIX.1 specifie _POSIX_C_SOURCE, _POSIX_SOURCE et _XOPEN_SOURCE.
_XOPEN_SOURCE_EXTENDED est specifiee par XPG4v2 (alias SUSv1).
_FILE_OFFSET_BITS n'est specifiee par aucune norme, mais est utilisee
par d'autres implementations.
_BSD_SOURCE, _SVID_SOURCE, _ATFILE_SOURCE, _GNU_SOURCE,
_FORTIFY_SOURCE, _REENTRANT et _THREAD_SAFE sont specifiques a Linux
(glibc).
NOTES
<features.h> est un fichier d'en-tete specifique a Linux/glibc.
D'autres systemes ont un fichier similaire, mais typiquement sous un
nom different. Ce fichier est inclus automatiquement par les autres en-
tetes si necessaire : il n'est pas necessaire de l'inclure
explicitement pour utiliser les macros de test de fonctionnalite.
Selon quelles macros de test de fonctionnalite ci-dessus sont definies,
<features.h> definit diverses autres macros qui sont testees par les
en-tetes de la glibc. Ces macros ont des noms prefixes par deux
caracteres underscore (par exemple __USE_MISC). Les programmes ne
doivent jamais definir ces macros directement ; ils doivent utiliser
les macros de test de fonctionnalite de la liste precedente.
EXEMPLE
Le programme ci-dessous peut etre utilise pour explorer comment les
differentes macros de test de fonctionnalites sont configurees en
fonction de la version de la glibc et quelle macros sont explicitement
definies. L'execution qui suit dans un interpreteur de commandes, sur
un systeme avec la glibc 2.10, montre quelques exemples de ce qu'on
peut voir :
$ cc ftm.c
$ ./a.out
_POSIX_SOURCE definie
_POSIX_C_SOURCE definie : 200809L
_BSD_SOURCE definie
_SVID_SOURCE definie
_ATFILE_SOURCE definie
$ cc -D_XOPEN_SOURCE=500 ftm.c
$ ./a.out
_POSIX_SOURCE definie
_POSIX_C_SOURCE definie : 199506L
_XOPEN_SOURCE definie : 500
$ cc -D_GNU_SOURCE ftm.c
$ ./a.out
_POSIX_SOURCE definie
_POSIX_C_SOURCE definie : 200809L
_ISOC99_SOURCE definie
_XOPEN_SOURCE definie : 700
_XOPEN_SOURCE_EXTENDED definie
_LARGEFILE64_SOURCE definie
_BSD_SOURCE definie
_SVID_SOURCE definie
_ATFILE_SOURCE definie
_GNU_SOURCE definie
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 definie\n");
#endif
#ifdef _POSIX_C_SOURCE
printf("_POSIX_C_SOURCE definie : %ldL\n", (long) _POSIX_C_SOURCE);
#endif
#ifdef _ISOC99_SOURCE
printf("_ISOC99_SOURCE definie\n");
#endif
#ifdef _XOPEN_SOURCE
printf("_XOPEN_SOURCE definie : %d\n", _XOPEN_SOURCE);
#endif
#ifdef _XOPEN_SOURCE_EXTENDED
printf("_XOPEN_SOURCE_EXTENDED definie\n");
#endif
#ifdef _LARGEFILE64_SOURCE
printf("_LARGEFILE64_SOURCE definie\n");
#endif
#ifdef _FILE_OFFSET_BITS
printf("_FILE_OFFSET_BITS definie : %d\n", _FILE_OFFSET_BITS);
#endif
#ifdef _BSD_SOURCE
printf("_BSD_SOURCE definie\n");
#endif
#ifdef _SVID_SOURCE
printf("_SVID_SOURCE definie\n");
#endif
#ifdef _ATFILE_SOURCE
printf("_ATFILE_SOURCE definie\n");
#endif
#ifdef _GNU_SOURCE
printf("_GNU_SOURCE definie\n");
#endif
#ifdef _REENTRANT
printf("_REENTRANT definie\n");
#endif
#ifdef _THREAD_SAFE
printf("_THREAD_SAFE definie\n");
#endif
#ifdef _FORTIFY_SOURCE
printf("_FORTIFY_SOURCE definie\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.32 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Julien Cristau et l'equipe francophone de traduction de
Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.