Что означает -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 и другие столкнулись с этим ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.