Quand tu fais
#define _XOPEN_SOURCE <some number>
ou
cc -D_XOPEN_SOURCE=<some number>
il indique à votre compilateur d'inclure des définitions pour certaines fonctions supplémentaires définies dans les normes X / Open et POSIX.
Cela vous donnera des fonctionnalités supplémentaires qui existent sur les systèmes UNIX / BSD / Linux les plus récents, mais qui n'existent probablement pas sur d'autres systèmes tels que Windows.
Les numéros font référence à différentes versions de la norme.
Vous pouvez déterminer celle dont vous avez besoin (le cas échéant) en consultant la page de manuel de chaque fonction que vous appelez.
Par exemple, man strdup
dit:
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
strndup(), strdupa(), strndupa(): _GNU_SOURCE
Ce qui signifie que vous devez en mettre un:
#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700
en haut de votre fichier source avant de faire des #include
s si vous souhaitez utiliser strdup
.
Ou tu pourrais mettre
#define _GNU_SOURCE
là à la place, ce qui active toutes les fonctionnalités, avec l'inconvénient de ne pas compiler sur Solaris, FreeBSD, Mac OS X, etc.
C'est une bonne idée de vérifier chaque page de manuel avant de faire une #include
, #define
ou d'utiliser une nouvelle fonction, car parfois leur comportement change en fonction des options et des #define
s que vous avez, par exemple avec basename (3) .
Voir également:
-D
est une option du compilateur ac pour définir une variable de préprocesseur. Dans ce cas_XOPEN_SOURCE
.Cela n'affecte pas réellement le comportement du compilateur lui-même, mais modifie plutôt le comportement de certaines bibliothèques, par exemple la bibliothèque c standard. Il existe plusieurs options comme celle-ci. Dans la plupart des cas, ils concernent un document standard sur une interface de programmation spécifique à UNIX ou un fournisseur de bibliothèque spécifique.
La définition de l'une d'entre elles est parfois nécessaire, car le comportement de certaines fonctions standard ou même leur signature peuvent différer d'une norme à l'autre. Vous devrez peut-être utiliser
-D_XOPEN_SOURCE
ou quelque chose de similaire pour activer un mode de compatibilité.Une autre utilisation possible de ces indicateurs est de vous assurer que votre code source reste dans les limites d'un certain standard, en tournant les extensions proposées par votre implémentation de bibliothèque C. C'est l'une des mesures que vous pouvez utiliser pour vous assurer que votre code s'exécute sur autant de plates-formes que possible.
la source
Cela expose l'en-tête à appartenir à une définition d'une norme donnée, telle que posix. La norme réelle à laquelle elle appartient est définie par la valeur (ici 400 ou 600 par exemple). Voir cette référence pour la liaison norme / valeur.
la source
Pour une raison inconnue, Mac OS / X (XCode) nécessite 600 pour définir strdup (), même si c'est dans la spécification de 1995. Mozilla et d' autres ont rencontré cela ...
la source