Подтвердить что ты не робот

Что делает -D_XOPEN_SOURCE?

Недавно я столкнулся с некоторым кодом, который gcc не будет компилировать без этого аргумента. Я проверил страницу gcc man, но не нашел эту конкретную опцию. Я нашел XOPEN_SOURCE, но было мало объяснений, что он делает.

Может кто-нибудь прокомментировать? Я знаю, что -D_XOPEN_SOURCE может быть установлен в разные значения, такие 400, 600, но что они делают?

4b9b3361

Ответ 1

Когда вы делаете

#define _XOPEN_SOURCE <some number>

или

cc -D_XOPEN_SOURCE=<some number>

он сообщает вашему компилятору включить определения для некоторых дополнительных функций, которые определены в стандартах X/Open и POSIX.

Это даст вам дополнительную функциональность, существующую на самых последних системах UNIX/BSD/Linux, но, вероятно, не существует в других системах, таких как Windows.

Номера относятся к разным версиям стандарта.

Вы можете указать, какой из них вам нужен (если есть), просмотрев справочную страницу для каждой функции, которую вы вызываете.

Например, man strdup говорит:

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
       strndup(), strdupa(), strndupa(): _GNU_SOURCE

Это означает, что вы должны поместить один из них:

#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700

вверху исходного файла перед тем, как сделать #include, если вы хотите использовать strdup.

Или вы можете поставить

#define _GNU_SOURCE

вместо этого, что позволяет использовать все функциональные возможности, которые могут не компилироваться в Solaris, FreeBSD, Mac OS X и т.д.

Рекомендуется проверить каждую страницу man перед тем, как делать #include, #define или использовать новую функцию, потому что иногда их поведение изменяется в зависимости от того, какие параметры и #define у вас есть, например, с basename (3).

См. также:

Ответ 2

-D - опция компилятора c для определения переменной препроцессора. В этом случае _XOPEN_SOURCE.

Это не влияет на поведение самого компилятора, а скорее влияет на то, как некоторые библиотеки, например. стандартная библиотека c, ведут себя. Существует несколько вариантов. В большинстве случаев они относятся к некоторому стандартному документу о каком-то конкретном программном интерфейсе UNIX или о конкретном поставщике библиотеки.

Иногда необходимо определить один из них, поскольку поведение некоторых стандартных функций или даже их подписи может различаться между стандартами. Поэтому вам может понадобиться использовать -D_XOPEN_SOURCE или что-то подобное, чтобы включить режим совместимости.

Еще одно возможное использование этих флагов - убедиться, что ваш исходный код остается в пределах определенного стандарта, путем включения расширений, предлагаемых вашей реализацией библиотеки C. Это одна из мер, которые вы можете использовать, чтобы убедиться, что ваш код работает на максимально возможном количестве платформ.

Ответ 3

Таким образом, заголовок должен принадлежать определению определенной нормы, например posix. Фактическая норма, к которой она принадлежит, определяется значением (здесь, например, 400 или 600). См. Ссылка для привязки к нормам/значениям.

Ответ 4

По какой-то неизвестной причине Mac OS/X (XCode) требует 600 для определения strdup(), даже если это в спецификации 1995 года. Mozilla и другие столкнулись с этим...