Когда ты делаешь
#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
или используя новую функцию, потому что иногда их поведение меняется в зависимости от того, какие параметры и #define
S у вас есть, например , с помощью базового имени (3) .
Смотрите также:
-D
Параметр компилятора ac для определения переменной препроцессора. В этом случае_XOPEN_SOURCE
.На самом деле это не влияет на поведение самого компилятора, а скорее меняет поведение некоторых библиотек, например стандартной библиотеки c. Таких вариантов несколько. В большинстве случаев они связаны с каким-то стандартным документом о каком-то специфическом программном интерфейсе UNIX или о каком-то конкретном поставщике библиотеки.
Иногда необходимо определение одного из них, поскольку поведение некоторых стандартных функций или даже их сигнатуры могут различаться в зависимости от стандарта. Так что вам, возможно, придется использовать
-D_XOPEN_SOURCE
или что-то подобное, чтобы включить режим совместимости.Еще одно возможное использование этих флагов - убедиться, что ваш исходный код находится в пределах определенного стандарта, путем включения расширений, предлагаемых вашей реализацией библиотеки C. Это одна из мер, которые вы можете использовать, чтобы убедиться, что ваш код работает на максимально возможном количестве платформ.
источник
Это показывает, что заголовок принадлежит определению данной нормы, например posix. Фактическая норма, которой он принадлежит, определяется значением (например, здесь 400 или 600). См. Эту ссылку для привязки нормы / значения.
источник
По какой-то неизвестной причине Mac OS / X (XCode) требует 600 для определения strdup (), хотя это указано в спецификации 1995 года. Mozilla и другие столкнулись с этим ...
источник