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: