Que signifie -D_XOPEN_SOURCE?

103

J'ai récemment rencontré du code que gcc ne compilerait pas sans cet argument. J'ai vérifié la page de manuel de gcc, mais je n'ai pas trouvé cette option spécifique. J'ai trouvé XOPEN_SOURCE, mais il y avait peu d'explications sur ce qu'il fait.

Quelqu'un peut-il préciser? Je sais que -D_XOPEN_SOURCEpeut être mis à des valeurs différentes, par exemple 400, 600mais qu'est-ce que ceux -ci ne?

anio
la source

Réponses:

132

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 strdupdit:

   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 #includes 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, #defineou d'utiliser une nouvelle fonction, car parfois leur comportement change en fonction des options et des #defines que vous avez, par exemple avec basename (3) .

Voir également:

Mikel
la source
4
Juste un commentaire pour souligner à quel point «en haut de votre fichier source» est important pour ces définitions de dialecte de langue. S'ils ne sont pas tout en haut, ils ne fonctionnent pas.
Dr. Person Person II
6

-Dest 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_SOURCEou 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.

Davrieb
la source
3

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.

Aif
la source
1

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 ...

jesup
la source