Heute musste ich die basename()
Funktion benutzen und das man 3 basename
( hier ) gab mir eine seltsame Nachricht:
Anmerkungen
Es gibt zwei verschiedene Versionen von basename () - die oben beschriebene POSIX- Version und die GNU-Version , nach der man sucht
#define _GNU_SOURCE
#include <string.h>
Ich frage mich, was das #define _GNU_SOURCE
bedeutet: Beschmutzt es den Code, den ich mit einer GNU-bezogenen Lizenz schreibe? Oder wird es einfach verwendet, um dem Compiler so etwas wie " Nun, ich weiß, dieser Funktionssatz ist nicht POSIX, also nicht portabel, aber ich würde ihn trotzdem gerne verwenden" zu sagen .
Wenn ja, warum nicht den Leuten unterschiedliche Header geben, anstatt ein obskures Makro definieren zu müssen, um die eine oder andere Funktionsimplementierung zu erhalten?
Etwas stört mich auch: Woher weiß der Compiler, welche Funktionsimplementierung mit der ausführbaren Datei verknüpft werden soll? Verwendet es #define
das auch?
Hat jemand ein paar Hinweise, die er mir geben kann?
_GNU_SOURCE
besteht, zu bekommenstrfry
undmemfrob
.#define _GNU_SOURCE
wird empfohlen, "das allererste Element in der Datei zu sein, dem nur Kommentare vorangestellt sind")._FILE_OFFSET_BITS
nicht daran_GNU_SOURCE
.Lassen Sie mich zwei weitere Punkte beantworten:
Ein üblicher Ansatz besteht darin , verschiedene Namen bedingt zu
#define
identifizierenbasename
, je nachdem, ob sie_GNU_SOURCE
definiert sind. Zum Beispiel:Jetzt muss die Bibliothek einfach beide Verhaltensweisen unter diesen Namen bereitstellen.
Oft hatte derselbe Header in verschiedenen Unix-Versionen leicht unterschiedliche Inhalte, daher gibt es keinen einzigen richtigen Inhalt für beispielsweise
<string.h>
- es gibt viele Standards ( xkcd ). Es gibt eine ganze Reihe von Makros, mit denen Sie Ihr Lieblingsmakro auswählen können. Wenn Ihr Programm einen Standard erwartet, entspricht die Bibliothek diesem Standard.quelle
Für genaue Details zu den Funktionen von
_GNU_SOURCE
kann die Dokumentation hilfreich sein.Aus der GNU-Dokumentation:
In der Linux-Manpage zu Funktionstestmakros :
Hinweis :
_GNU_SOURCE
Muss vor dem Einfügen von Header-Dateien definiert werden, damit die jeweiligen Header die Funktionen aktivieren. Beispielsweise:_GNU_SOURCE
kann auch pro Kompilierung mit-D
flag aktiviert werden :(
-D
ist nicht spezifisch,_GNU_SOURCE
aber jedes Makro kann auf diese Weise definiert werden).quelle
Aus einer Mailingliste über Google:
Es ermöglicht also eine ganze Reihe von Kompilierungsflags für gcc
quelle