NOM¶
feature_test_macros - Macros de test de fonctionnalités
SYNOPSIS¶
#include <features.h>
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‐tê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‐tê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‐tê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‐dessous peuvent être vérifiés en
inspectant le fichier d'en‐tête
<features.h>
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);
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
|| signifies qua 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 :
#define _BSD_SOURCE
#define _XOPEN_SOURCE /* 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 # 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__
- 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 :
- •
- 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.
- _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‐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). 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.
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.
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 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
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 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);
}
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.44 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¶
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 à
<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> ».