2009-06-23 7 views
3

Sous Solaris, pour obtenir le champ msg_control dans la structure msghdr et avoir IPV6_TCLASS, il semble que je doive définir _XPG4_2 et __EXTENSIONS__.Comment _XPG4_2 et d'autres définitions fonctionnent sur Solaris?

Il semble fonctionner si je définis simplement ceux-ci à 1 avant d'inclure quoi que ce soit:

#if defined (__SVR4) && defined (__sun) 
# define _XPG4_2 1 
# define __EXTENSIONS__ 1 
#endif 
  1. Dois-je le faire de cette façon?
  2. Ai-je besoin de les définir dans tous les fichiers source, ou de mauvaises choses peuvent se produire?
  3. Y a-t-il une liste de ces choses quelque part?

Ceci est en rapport avec this question.

Répondre

8

man -k XPG4 révèle qu'il ya une page de manuel standards(5), qui énumère les macros de test de fonctionnalité et d'information reliant la bibliothèque pour diverses normes, dont les suivantes:

X/Open CAE Pour construire ou compiler une application est conforme à l'une des spécifications XE Open XE Open, utilisez les directives suivantes. Les applications n'ont pas besoin de définir les macros de test de fonctionnalité POSIX si elles nécessitent à la fois les fonctionnalités CAE et POSIX.

SUS (XPG4v2) 
     The application must define _XOPEN_SOURCE with a value 
     other than 500 (preferably 1) and set 
     _XOPEN_SOURCE_EXTENDED=1. 

Grepping par /usr/include pour _XOPEN_SOURCE tourne plus d'informations en /usr/include/sys/feature_tests.h:

écrivains d'application qui souhaitent utiliser toutes les fonctions spécifiées comme X/Open UNIX Extension doit définir _XOPEN_SOURCE et _XOPEN_SOURCE_EXTENDED=1. La macro interne Sun _XPG4_2 ne doit pas être utilisée à sa place car des résultats inattendus peuvent se produire.

Donc définir _XPG4_2 n'est pas la façon de le faire.

Si des définitions de structure dépendent de ces macros, il est préférable de les définir dans toutes les unités de traduction. Le moyen le plus simple est de les spécifier sur la ligne de commande du compilateur:

cc -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1 

Si vous utilisez make, vous devriez être en mesure de le faire en ajoutant les -D paramètres à la variable CFLAGS:

CFLAGS += -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1 
Questions connexes