Когда ты делаешь
#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) .
Смотрите также: