Lorsque vous ne
#define _XOPEN_SOURCE <some number>
ou
cc -D_XOPEN_SOURCE=<some number>
il indique au compilateur d'inclure les définitions de certaines fonctions supplémentaires sont définis dans l'X/Open et normes de POSIX.
Cela va vous donner quelques fonctionnalités supplémentaires qui existe sur la plupart des récentes UNIX/BSD/Linux, mais probablement n'existe pas sur d'autres systèmes tels que Windows.
Les numéros se réfèrent aux différentes versions de la norme.
Vous pouvez dire que l'on vous avez besoin (le cas échéant) en regardant la page de man 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 devriez 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 l' #include
s si vous souhaitez utiliser strdup
.
Ou vous pourriez mettre
#define _GNU_SOURCE
il y a la place, ce qui permet à toutes les fonctionnalités, avec l'inconvénient que cela pourrait ne pas compiler sur Solaris, FreeBSD, Mac OS X, etc.
C'est une bonne idée de vérifier chaque page de man avant de faire un #include
, #define
, ou à l'aide d'une nouvelle fonction, parce que, parfois, leurs changements de comportement en fonction de ce que les options et #define
s, vous avez, par exemple avec basename(3).
Voir aussi: