FEATURE_TEST_MACROS
Section : Manuel du programmeur Linux (
7)
Mise à jour de la version anglaise : 2 janvier 2008
Index
Menu principal
NOM
feature_test_macros - Macros de test de fonctionnalité
SYNOPSIS
#include <features.h>
DESCRIPTION
Les macros de test de fonctionnalité permettent au programmeur de contrôler
les définitions qui seront exposées par les fichiers d'entêtes système
lorsqu'un programme est compilé.
Cela est utile pour la création d'applications portables, en empêchant les
définitions non standard d'être exposées.
D'autres macros peuvent être utilisées pour exposer des définitions
non standard qui ne le sont pas par défaut.
Les effets précis de chacune de ces macros de test de fonctionnalité
décrites plus loin peuvent être constatés en inspectant
le fichier d'entête
<features.h>.
Pour quelle soit effective, une macro de test de fonctionnalité
doit être définie avant l'inclusion de tout autre fichier d'entête.
Cela peut être fait soit dans la commande de compilation
(cc -DMACRO=valeur),
soit en définissant la macro dans le code source avant d'inclure
les entêtes.
Spécification d'exigences de macros de test de fonctionnalités dans les pages de manuels
Lorsqu'une fonction a besoin que soit définie une macro de test
de fonctionnalité, le SYNOPSIS de la page de manuel inclut une note de la
forme suivante (cet exemple est extrait de la page de
chmod(2)
-
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
Exigences de macros de test de fonctionnalités pour la glibc (voir
feature_test_macros(7)):
fchmod():
_BSD_SOURCE || _XOPEN_SOURCE >= 500
Le
||
signifie que pour obtenir la déclaration de
fchmod(2)
à partir de
<sys/stat.h>,
l'une
des définitions de macro suivantes doit être faite avant d'inclure
tout fichier d'entêtes :
-
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500 /* Ou toute valeur > 500 */
De manière alternative, des définitions équivalentes peuvent être
incluses sur la ligne de commande de compilation :
-
cc -D_BSD_SOURCE
cc -D_XOPEN_SOURCE=500 # Ou toute valeur > 500
Veuillez noter que, comme décrit plus loin,
certaines macros de test de fonctionnalités sont définies par défaut,
aussi, il n'est pas toujours nécessaire de spécifier explicitement la
(les) macro(s) de test de fonctionnalités indiquée(s) dans le SYNOPSIS.
Dans quelques cas, les pages de manuel utilisent un raccourci pour
exprimer les exigences de macros de tests de fonctionnalité (cet exemple
est extrait de la page
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ù une seule macro de test de
fonctionnalité est utilisée pour exposer la déclaration de la fonction,
et que la macro n'est pas définie par défaut.
Macros de test de fonctionnalités reconnues par la glibc
Les paragraphes suivants expliquent comment les macros de test
de fonctionnalités sont gérées par les glibc 2.
x Linux,
x > 0.
La glibc Linux reconnaît les macros de test de fonctionnalités suivantes :
- __STRICT_ANSI__
-
ISO Standard C.
Cette macro est implicitement définie par
gcc(1)
lorsqu'il est invoqué, par exemple, avec l'option
-std=c99
ou l'option
-ansi.
- _POSIX_C_SOURCE
-
Définir cette macro fait que les fichiers d'entêtes exposeront
les définitions comme suit :
-
- *
-
La valeur 1 expose les définitions conformes à POSIX.1-1990 et
ISO C (1990).
- *
-
La valeur 2 ou supérieur expose en plus les définitions pour
POSIX.2-1992.
- *
-
La valeur 199309L ou supérieur expose en plus les définitions
POSIX.1b (extensions temps réel).
- *
-
La valeur 199506L ou supérieur expose en plus les définitions
pour POSIX.1c (threads).
- *
-
(Depuis la glibc 2.3.3)
La valeur 200112L ou supérieur expose en plus les définitions
correspondant à la spécification de base de POSIX.1-2001 (excluant
l'extension XSI).
- _POSIX_C_SOURCE
-
Définir cette macro obsolète avec n'importe quelle valeur est équivalent
à définir
_POSIX_SOURCE
à une valeur de 1.
- _XOPEN_SOURCE
-
Définir cette macro fera que les fichiers d'entêtes exposeront
les définitions comme suit :
-
- *
-
La définir avec n'importe quelle valeur exposera les définitions
conformes à POSIX.1, POSIX.2 et XPG4.
- *
-
La définir avec la valeur 500 ou plus exposera en plus les définitions pour
SUSv2 (UNIX 98).
- *
-
(Depuis la glibc 2.2)
La définir avec la valeur 600 ou plus exposera en plus les définitions pour
SUSv3 (UNIX 03 ; c'est-à-dire, la spécification de base POSIX.1-2001 plus
l'extension XSI) et les définitions C99.
- _XOPEN_SOURCE_EXTENDED
-
Si cette macro est définie et que
_XOPEN_SOURCE
est définie, cela exposera les définitions correspondant aux extensions
UNIX (UNIX 95) XPG4v2 (SUSv1).
Cette macro est également implicitement définie si
_XOPEN_SOURCE
est définie avec une valeur de 500 ou plus.
- _ISOC99_SOURCE
-
Exposer les extensions C99 de ISO C (1990).
Cette macro est reconnue depuis la glibc 2.1.3 ;
les versions de la glibc antérieures à la 2.1.x reconnaissaient une macro
équivalente qui s'appelait
_ISOC9X_SOURCE
(parce que la norme C99 ne l'a jamais finalisée).
Aussi, l'utilisation de cette dernière macro est obsolète.
La glibc continue toutefois de la reconnaître pour des raisons de
rétro-compatibilité.
- _LARGEFILE64_SOURCE
-
Exposer les définitions pour l'API alternative spécifiée par
LFS (Large File Summit) comme une « extention transitionnelle » les
« Single UNIX Specification ».
(Voir http://opengroup.org/platform/lfs.html.)
L'API alternative consiste en un ensemble de nouveaux objets
(c'est-à-dire, des fonctions et des types) dont les noms sont
suffixés avec « 64 » (par exemple,
(e.g.,
off64_t
versus
off_t,
lseek64()
versus
lseek(),
etc.).
Les nouveaux programmes ne doivent par utiliser cette interface ;
ils doivent utiliser
_FILE_OFFSET_BITS=64
à la place.
- _FILE_OFFSET_BITS
-
Définir cette macro avec la valeur 64 convertira automatiquement les
références aux fonctions 32 bits et aux types de données relatives aux
entrées-sorties de fichiers et aux opérations sur le système de fichiers
en leurs équivalents 64 bits.
Cela est utile pour effectuer des entrées-sorties sur de gros fichiers
(> 2 gigaoctets) sur des systèmes 32 bits.
(Définir cette macro permet aux programes correctement écrits, manipulant
de gros fichiers, de n'avoir besoin que d'une recompilation.)
Les systèmes 64 bits permettent naturellement des tailles de fichiers
supérieures à 2 gigaoctets, et sur de tels systèmes,
cette macro n'a aucun effet.
- _BSD_SOURCE
-
Définir cette macro avec n'importe quelle valeur fera que les fichiers
d'entêtes exposeront les définitions dérivées de BSD.
Définir cette macro fera aussi que les définitions BSD seront préférées
dans les situations où les normes sont en conflit, à moins qu'une ou
plusieurs parmi
_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
-
Définir cette macro avec n'importe quelle valeur fera que les fichiers
d'entêtes exposeront les définitions dérivées de System V.
(SVID == System V Interface Definition ;
standards(7).)
- _ATFILE_SOURCE (depuis la glibc 2.4)
-
Définir cette macro avec n'importe quelle valeur fera que les fichiers
d'entêtes exposeront les déclarations d'un ensemble de fonctions
suffixées avec « at » ; voir
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 200112L (199506L dans les versions de la glibc avant 2.5),
et
_XOPEN_SOURCE
avec la valeur 600 (500 dans les versions de la glibc avant 2.2).
De plus, diverses extensions spécifiques GNU seront également exposées.
- _REENTRANT
-
Définir cette macro expose 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 compatibilité avec quelques autres implémentations.
- _FORTIFY_SOURCE (depuis la glibc 2.3.4)
-
Définir cette macro déclenche certaines vérifications peu couteuses pour
détecter certaines erreurs de débordements de tampon lors de l'utilisation
de diverses fonctions de manipulation de chaînes et de mémoire.
Tous les débordements de tampon ne sont pas détectés,
juste dans certains cas fréquents.
Dans l'implémentation actuelle, 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éfinie à 1, avec une optimisation de compilation de niveau 1
(gcc -O1)
ou plus, vérifie que cela ne modifie pas le comportement des programmmes
conformes.
Avec
_FORTIFY_SOURCE
définie à 2, des vérifications supplémentaires sont ajoutées mais certains
programmes conformes peuvent échoués.
Certaines des vérifications peuvent être effectuées à la compilation
et générent des avertissements de la part du compilateur ;
d'autres auront lieu à l'exécution et provoqueront une erreur d'exécution
si la vérification échoue.
L'utilisation de cette macro nécessite une prise en charge
par le compilateur 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és n'est explicitement définie,
les macros suivantes sont définies par défaut :
_BSD_SOURCE,
_SVID_SOURCE,
_POSIX_SOURCE
et
_POSIX_C_SOURCE=200112L.
(199506L dans les versions de la glibc avant 2.4)
Si l'une parmi
__STRICT_ANSI__,
_ISOC99_SOURCE,
_POSIX_SOURCE,
_POSIX_C_SOURCE,
_XOPEN_SOURCE,
_XOPEN_SOURCE_EXTENDED,
_BSD_SOURCE
ou
_SVID_SOURCE
est explicitement définie,
_BSD_SOURCE,
et
_SVID_SOURCE
ne sont pas définies par défaut.
SI
_POSIX_SOURCE
et
_POSIX_C_SOURCE
ne sont pas explicitement définies,
et si
__STRICT_ANSI__
ou
_XOPEN_SOURCE
n'est pas définie avec une valeur de 500 ou plus, alors
-
- *
-
_POSIX_SOURCE
est définie avec une valeur de 1 ; et
- *
-
_POSIX_C_SOURCE
est définie avec l'une des valeurs suivantes :
-
- *
-
2,
si
XOPEN_SOURCE
est définie avec une valeur inférieure à 500 ;
- *
-
199506L,
si
XOPEN_SOURCE
est définie avec une valeur supérieur ou égale à 500
et inférieure à 600 ; ou
- *
-
200112L (199506L dans les versions de la glibc avant 2.4),
si
XOPEN_SOURCE
n'est pas définie ou est définie avec une valeur
supérieure ou égale à 600.
Plusieurs macros peuvent être définies ; les résultats s'additionnent.
CONFORMITÉ
POSIX.1 spécifie
_POSIX_C_SOURCE,
_POSIX_SOURCE
et
_XOPEN_SOURCE.
_XOPEN_SOURCE_EXTENDED
était spécifiée par XPG4v2 (aka SUSv1).
_FILE_OFFSET_BITS
n'est spécifiée par aucune norme mais est employée dans quelques autres
implémentations.
_BSD_SOURCE,
_SVID_SOURCE,
_GNU_SOURCE,
_FORTIFY_SOURCE,
_REENTRANT
et
_THREAD_SAFE
sont spécifiques à Linux (glibc).
NOTES
<features.h>
est un fichier d'entête spécifique à Linux/glibc.
D'autres systèmes ont un fichier analogue mais avec un nom différent.
Ce fichier d'entête est automatiquement inclus par d'autres fichiers
d'entêtes comme nécessaire : il n'est donc pas nécessaire de l'inclure
explicitement pour pouvoir utiliser les macros de test de fonctionnalité.
Selon quelles macros de test de fonctionnalité parmi les précédentes sont
définies,
<features.h>
définit de manière interne diverses autres macros qui sont vérifiées par
d'autres fichiers d'entêtes de la glibc.
Ces macros ont des noms préfixés par deux caractères « soulignement »
(par exemple :
__USE_MISC).
Les programmes
ne
doivent
jamais
définir ces macros directement :
ils doivent à la place utiliser la (les) macro(s) de test
de fonctionnalité de la liste précédente.
VOIR AUSSI
standards(7)
La section « Feature Test Macros » de
info libc.
/usr/include/features.h
TRADUCTION
Ce document est une traduction réalisée par Alain Portal
<aportal AT univ-montp2 DOT fr> le 4 août 2006
et révisée le 17 juillet 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation
française de qualité. La version anglaise la plus à jour de ce document est
toujours consultable via la commande : « LANG=C man 7 feature_test_macros ».
N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute
erreur dans cette page de manuel.
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- Spécification d'exigences de macros de test de fonctionnalités dans les pages de manuels
-
- Macros de test de fonctionnalités reconnues par la glibc
-
- Définitions par défaut, définitions implicites et combinaison de définitions
-
- CONFORMITÉ
-
- NOTES
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 17 juillet 2008