Коли ви це зробите
#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
s, якщо ви хочете використовувати strdup
.
Або ти міг би поставити
#define _GNU_SOURCE
там замість цього, що забезпечує всю функціональність, з мінусом, що він може не компілюватися на Solaris, FreeBSD, Mac OS X тощо.
Це гарна ідея , щоб перевірити кожна людина сторінки перед виконанням #include
, #define
або використовуючи нову функцію, тому що іноді їх поведінка змінюється в залежності від того, які параметри і #define
S у вас є, наприклад , з допомогою базового імені (3) .
Дивитися також: