125 votes

Qu'est -D_XOPEN_SOURCE faire/dire?

J'ai récemment rencontré un peu de code que gcc ne serait pas compiler sans cette arg. J'ai vérifié la page de man de gcc, mais n'a pas trouvé cette option spécifique. Je n'ai trouver XOPEN_SOURCE, mais il y avait peu d'explication de ce qu'il fait.

Quelqu'un peut-il donner des précisions? Je sais -D_XOPEN_SOURCE peut être réglé à des valeurs différentes, par exemple 400, 600, mais que font ceux-ci?

Merci.

164voto

Mikel Points 10000

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' #includes 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 #defines, vous avez, par exemple avec basename(3).

Voir aussi:

8voto

davrieb Points 179

-D est un compilateur c option pour définir une variable de préprocesseur. Dans ce cas - _XOPEN_SOURCE.

Ce n'est pas réellement une incidence sur le comportement du compilateur lui-même, mais plutôt les changements de la façon dont certaines bibliothèques, par exemple, la bibliothèque standard c, de se comporter. Il y a plusieurs options comme ceci. Dans la plupart des cas, ils sont en relation avec certains de document standard sur certains UNIX spécifiques de l'interface de programmation, ou de certains fournisseur de bibliothèque.

La définition de l'un d'eux est parfois nécessaire, car le comportement de certaines fonctions standard ou même leur signature peuvent différer entre les normes. Alors vous pourriez avoir à utiliser -D_XOPEN_SOURCE ou quelque chose de similaire pour activer un mode de compatibilité.

Un autre usage possible de ces indicateurs est de s'assurer que votre code source reste dans les limites de certaines normes, en tournant des extensions proposées par votre bibliothèque C de mise en œuvre. 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.

4voto

Aif Points 4603

Cela expose l'en-tête d'appartenir à une définition d'une norme donnée, comme posix. La réelle de la norme, il appartient à est définie par la valeur (ici 400 ou 600 par exemple). Voir cette Référence pour la norme/valeur contraignante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X