Lorsque vous faites
#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 qui sont 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 renvoient à différentes versions de la norme.
Vous pouvez dire lequel vous avez besoin (le cas échéant) en regardant la page de manuel pour 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 mettre un de ces:
#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 voulez utiliser strdup
.
Ou vous pourriez mettre
#define _GNU_SOURCE
il lieu, ce qui permet à toutes les fonctionnalités, avec l'inconvénient que cela pourrait ne pas compiler sur Solaris, FreeBSD, Mac OS X, etc.
Il est une bonne idée pour vérifier chaque page de manuel avant de faire un #include
, #define
, ou en utilisant une nouvelle fonction, car parfois leur comportement change en fonction des options et #define
que vous avez, par exemple avec basename(3).
Voir aussi:
Juste un commentaire pour souligner combien important "au sommet de votre fichier source" est pour ces définitions langage dialecte. S'ils ne sont pas au sommet, ils ne fonctionnent pas. –