Что делает / значит -D_XOPEN_SOURCE? - PullRequest
91 голосов
/ 21 марта 2011

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

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

Ответы [ 4 ]

119 голосов
/ 20 апреля 2011

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

#define _XOPEN_SOURCE <some number>

или

cc -D_XOPEN_SOURCE=<some number>

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

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

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

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

Например, 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 s у вас есть, например, с basename (3) .

См. также:

6 голосов
/ 21 марта 2011

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

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

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

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

3 голосов
/ 21 марта 2011

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

0 голосов
/ 28 марта 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...