2009-06-23 3 views
3

В Solaris, чтобы получить поле msg_control в struct msghdr и иметь IPV6_TCLASS, мне кажется, нужно определить _XPG4_2 и __EXTENSIONS__.Как работает _XPG4_2 и другие, работающие над Solaris?

Это похоже на работу, если я просто определить их 1, прежде чем включать все:

#if defined (__SVR4) && defined (__sun) 
# define _XPG4_2 1 
# define __EXTENSIONS__ 1 
#endif 
  1. Должен ли я сделать это таким образом?
  2. Нужно ли определять их во всех исходных файлах, или могут произойти плохие вещи?
  3. Есть ли список этих вещей где-то?

Это связано с this question.

ответ

8

man -k XPG4 показывает, что есть standards(5) людей страница, на которой перечислены тестовые макросы и библиотеки, связывающие данные для различных стандартов, в том числе следующего:

X/Open CAE Чтобы построить или компилировать приложение, которое соответствует одному из спецификациям X/Open CAE, используйте следующие рекомендации. Приложениям не нужно устанавливать макросы проверки функций POSIX, если им требуются как функции CAE, так и POSIX.

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

/usr/include через оглавлению для _XOPEN_SOURCE получается больше информации в /usr/include/sys/feature_tests.h:

приложений авторы, желающие использовать любые функции, указанные в X/Open UNIX Extension необходимо определить _XOPEN_SOURCE и _XOPEN_SOURCE_EXTENDED=1. Внутренний макрос Sun _XPG4_2 не должен использоваться на своем месте, так как могут возникнуть неожиданные результаты.

Таким образом, определение _XPG4_2 не является для него способом.

Если какие-либо определения структуры зависят от этих макросов, вам определенно будет лучше определять их во всех единицах перевода. Самый простой способ сделать это, чтобы указать их в командной строке компилятора:

cc -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1 

Если вы используете make, вы должны быть в состоянии сделать это, добавив -D параметры в CFLAGS переменной:

CFLAGS += -D_XOPEN_SOURCE=1 -D_XOPEN_SOURCE_EXTENDED=1