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 strdup
mó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, #include
jeś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
, #define
lub użyciem nowej funkcji, ponieważ czasami ich zachowanie zmienia się w zależności od #define
posiadanych opcji i opcji , na przykład basename (3) .
Zobacz też:
-D
jest 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_SOURCE
czegoś 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.
źródło
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.
źródło
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 ...
źródło