2011-03-21 2 views
80

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 n'ai pas trouvé cette option spécifique. J'ai trouvé XOPEN_SOURCE, mais il y avait peu d'explication de ce qu'il fait.Que fait/D_XOPEN_SOURCE?

Quelqu'un peut-il élaborer? Je sais -D_XOPEN_SOURCE peut être réglé à différentes valeurs, telles que 400, 600, mais qu'est-ce que ceux-ci font?

Répondre

105

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:

+1

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

3

Ceci expose l'en-tête à appartenir à une définition d'une norme donnée, telle que posix. La norme à laquelle elle appartient est définie par la valeur (ici 400 ou 600 par exemple). Voir ce Reference pour la liaison norm/value.

7

-D est une option du compilateur c 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 change plutôt la façon dont certaines bibliothèques, par ex. la bibliothèque c standard, se comporter. Il y a plusieurs options comme celle-ci. Dans la plupart des cas, ils sont liés à un document standard sur une interface de programmation spécifique à UNIX ou à un vendeur de bibliothèque spécifique.

La définition de l'un d'entre eux est parfois nécessaire, car le comportement de certaines fonctions standard ou même leur signature peut différer d'une norme à l'autre. Il se peut donc que vous deviez utiliser -D_XOPEN_SOURCE ou quelque chose de similaire pour activer un mode de compatibilité.

Une autre utilisation possible de ces indicateurs est de s'assurer que votre code source reste dans les limites d'une certaine norme, en tournant les extensions offertes par votre implémentation de la 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.

0

Pour certains reaso inconnu n, Mac OS/X (XCode) requiert 600 pour définir strdup(), même si c'est dans la spécification de 1995. Mozilla et others ont couru dans ce ...

Questions connexes