Как _XPG4_2 и другие определения работают на Solaris? - PullRequest
3 голосов
/ 23 июня 2009

В Solaris, чтобы получить поле msg_control в struct msghdr и иметь IPV6_TCLASS, мне кажется, мне нужно определить _XPG4_2 и __EXTENSIONS __.

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

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

Это относится к этому вопросу .

1 Ответ

10 голосов
/ 25 июня 2009

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, должны определить _XOPEN_SOURCE и _XOPEN_SOURCE_EXTENDED=1. Внутренний макрос Солнца _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
...