Dzisiaj musiałem skorzystać z basename()
funkcji, a man 3 basename
( tutaj ) dał mi dziwną wiadomość:
Uwagi
Istnieją dwie różne wersje basename () - wersja POSIX opisana powyżej oraz wersja GNU , którą otrzymuje się po
#define _GNU_SOURCE
#include <string.h>
Zastanawiam się, co to #define _GNU_SOURCE
oznacza: czy jest to skażenie kodu, który piszę, na licencji GNU? A może po prostu mówi kompilatorowi coś w stylu: „ Wiem, że ten zestaw funkcji nie jest POSIX-owy, więc nie jest przenośny, ale i tak chciałbym go użyć ”.
Jeśli tak, dlaczego nie dać ludziom różnych nagłówków, zamiast definiować jakieś niejasne makro, aby uzyskać jedną implementację funkcji lub inną?
Coś też mnie niepokoi: skąd kompilator wie, którą implementację funkcji połączyć z plikiem wykonywalnym? Czy to też używa #define
?
Czy ktoś ma mi jakieś wskazówki?
_GNU_SOURCE
jest zdobyciestrfry
imemfrob
.#define _GNU_SOURCE
Zaleca się, aby był „pierwszą rzeczą w pliku, poprzedzoną jedynie komentarzami”)._FILE_OFFSET_BITS
, nie_GNU_SOURCE
.Pozwól, że odpowiem na dwie dalsze kwestie:
Typowym podejściem jest warunkowe
#define
identyfikowaniebasename
różnych nazw, w zależności od tego, czy_GNU_SOURCE
są zdefiniowane. Na przykład:Teraz biblioteka musi po prostu zapewnić oba zachowania pod tymi nazwami.
Często ten sam nagłówek miał nieco inną zawartość w różnych wersjach Uniksa, więc nie ma jednej właściwej treści dla, powiedzmy,
<string.h>
- istnieje wiele standardów ( xkcd ). Istnieje cały zestaw makr do wybrania swojego ulubionego, więc jeśli twój program oczekuje jednego standardu, biblioteka będzie się z nim zgadzać.źródło
Aby uzyskać szczegółowe informacje na temat tego, co jest włączone
_GNU_SOURCE
, pomocna może być dokumentacja.Z dokumentacji GNU:
Ze strony podręcznika Linux na temat makr testowania funkcji :
Uwaga :
_GNU_SOURCE
należy zdefiniować przed dołączeniem plików nagłówkowych, aby odpowiednie nagłówki włączały funkcje. Na przykład:_GNU_SOURCE
można również włączyć na kompilację za pomocą-D
flagi:(
-D
nie jest specyficzne dla,_GNU_SOURCE
ale każde makro jest zdefiniowane w ten sposób).źródło
Z jakiejś listy mailingowej przez Google:
Więc umożliwia kompilację wielu flag dla gcc
źródło