Що означає -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

у верхній частині вихідного файлу, перш ніж робити будь-які #includes, якщо ви хочете використовувати strdup.

Або ти міг би поставити

#define _GNU_SOURCE

там замість цього, що забезпечує всю функціональність, з мінусом, що він може не компілюватися на Solaris, FreeBSD, Mac OS X тощо.

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

Дивитися також:


4
Просто коментар, щоб підкреслити, наскільки важливим для цих діалектних мов є "вгорі вихідного файлу". Якщо вони не на самому верху, вони не працюють.
Dr. Person Person II

6

-Dє опцією компілятора змінного струму для визначення змінної препроцесора. У цьому випадку _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.