Что означает -D_XOPEN_SOURCE?

103

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

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

анио
источник

Ответы:

132

Когда ты делаешь

#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 и т. д.

Это хорошая идея , чтобы проверить каждый человек страницы перед выполнением #include, #defineили используя новую функцию, потому что иногда их поведение меняется в зависимости от того, какие параметры и #defineS у вас есть, например , с помощью базового имени (3) .

Смотрите также:

Микель
источник
4
Просто комментарий, чтобы подчеркнуть, насколько важно "вверху исходного файла" для этих определений диалекта языка. Если они не на самом верху, они не работают.
Dr. Person Person II
6

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

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

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

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

Давриб
источник
3

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

Аиф
источник
1

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

jesup
источник