Co znaczy -D_XOPEN_SOURCE?

103

Niedawno napotkałem kod, którego gcc nie skompilowałby bez tego argumentu. Sprawdziłem stronę podręcznika gcc, ale nie znalazłem tej konkretnej opcji. Znalazłem XOPEN_SOURCE, ale niewiele było wyjaśnienia, do czego służy.

Czy ktoś może coś rozwinąć? Wiem, że -D_XOPEN_SOURCEmożna ustawić różne wartości, takie 400, 600ale to, co czynili DO?

anio
źródło

Odpowiedzi:

132

Kiedy to zrobisz

#define _XOPEN_SOURCE <some number>

lub

cc -D_XOPEN_SOURCE=<some number>

mówi kompilatorowi, aby załączył definicje niektórych dodatkowych funkcji, które są zdefiniowane w standardach X / Open i POSIX.

Zapewni to dodatkowe funkcje, które istnieją w najnowszych systemach UNIX / BSD / Linux, ale prawdopodobnie nie istnieją w innych systemach, takich jak Windows.

Numery odnoszą się do różnych wersji normy.

Możesz określić, którego potrzebujesz (jeśli w ogóle), patrząc na stronę podręcznika dla każdej wywoływanej funkcji.

Na przykład man strdupmówi:

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
       strndup(), strdupa(), strndupa(): _GNU_SOURCE

Co oznacza, że ​​powinieneś umieścić jeden z tych:

#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700

na górze pliku źródłowego przed wykonaniem jakichkolwiek czynności, #includejeśli chcesz użyć strdup.

Albo możesz położyć

#define _GNU_SOURCE

zamiast tego, co zapewnia wszystkie funkcje, z wadą polegającą na tym, że może nie kompilować się na Solarisie, FreeBSD, Mac OS X itp.

Dobrym pomysłem jest sprawdzenie każdej strony podręcznika przed wykonaniem a #include, #definelub użyciem nowej funkcji, ponieważ czasami ich zachowanie zmienia się w zależności od #defineposiadanych opcji i opcji , na przykład basename (3) .

Zobacz też:

Mikel
źródło
4
Tylko komentarz, aby podkreślić, jak ważne jest określenie „na początku pliku źródłowego” dla tych definicji dialektu językowego. Jeśli nie są na samej górze, nie działają.
Dr Osoba Osoba II
6

-Djest opcją kompilatora ac służącą do definiowania zmiennej preprocesora. W tym przypadku _XOPEN_SOURCE.

W rzeczywistości nie wpływa to na zachowanie samego kompilatora, ale raczej zmienia sposób zachowania niektórych bibliotek, np. Standardowej biblioteki c. Jest kilka takich opcji. W większości przypadków są one związane z jakimś standardowym dokumentem dotyczącym określonego interfejsu programistycznego UNIX lub określonego dostawcy biblioteki.

Zdefiniowanie jednego z nich jest czasami konieczne, ponieważ zachowanie niektórych standardowych funkcji lub nawet ich sygnatura może się różnić w zależności od standardów. Więc być może będziesz musiał użyć -D_XOPEN_SOURCEczegoś podobnego, aby włączyć tryb zgodności.

Innym możliwym zastosowaniem tych flag jest upewnienie się, że kod źródłowy pozostaje w granicach określonego standardu, poprzez włączenie rozszerzeń oferowanych przez implementację biblioteki C. Jest to jeden ze środków, których możesz użyć, aby upewnić się, że kod działa na jak największej liczbie platform.

davrieb
źródło
3

To naraża nagłówek na przynależność do definicji danej normy, takiej jak posix. Faktyczna norma, do której należy, jest określona wartością (tutaj na przykład 400 lub 600). Zobacz to odniesienie dla powiązania normy / wartości.

Aif
źródło
1

Z jakiegoś nieznanego powodu Mac OS / X (XCode) wymaga 600 do zdefiniowania strdup (), mimo że jest to zgodne ze specyfikacją z 1995 roku. Mozilla i inni napotkali to ...

jesup
źródło