Was bedeutet -D_XOPEN_SOURCE?

103

Ich bin kürzlich auf Code gestoßen, den gcc ohne dieses Argument nicht kompilieren würde. Ich habe die gcc-Manpage überprüft, aber diese spezielle Option nicht gefunden. Ich habe es gefunden XOPEN_SOURCE, aber es gab wenig Erklärung dafür, was es tut.

Kann jemand bitte näher darauf eingehen? Ich weiß, -D_XOPEN_SOURCEdass unterschiedliche Werte eingestellt werden 400können 600, aber was machen diese?

anio
quelle

Antworten:

132

Wenn Sie das tun

#define _XOPEN_SOURCE <some number>

oder

cc -D_XOPEN_SOURCE=<some number>

Es weist Ihren Compiler an, Definitionen für einige zusätzliche Funktionen aufzunehmen, die in den X / Open- und POSIX-Standards definiert sind.

Auf diese Weise erhalten Sie einige zusätzliche Funktionen, die auf den neuesten UNIX / BSD / Linux-Systemen vorhanden sind, auf anderen Systemen wie Windows jedoch wahrscheinlich nicht.

Die Zahlen beziehen sich auf verschiedene Versionen des Standards.

Sie können feststellen, welche Sie benötigen (falls vorhanden), indem Sie sich die Manpage für jede von Ihnen aufgerufene Funktion ansehen.

Zum Beispiel man strdupsagt:

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

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

Was bedeutet, dass Sie eine dieser setzen sollten:

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

oben in Ihrer Quelldatei, bevor #includeSie s ausführen, wenn Sie verwenden möchten strdup.

Oder du könntest sagen

#define _GNU_SOURCE

Dort wird stattdessen alle Funktionalität aktiviert, mit dem Nachteil, dass es unter Solaris, FreeBSD, Mac OS X usw. möglicherweise nicht kompiliert werden kann.

Es ist eine gute Idee , jeden Mann Seite zu überprüfen , bevor ein tun #include, #defineoder eine neue Funktion, denn manchmal ihr Verhalten auf , welche Optionen in Abhängigkeit davon ändert und #defines Sie haben zum Beispiel mit Basisnamen (3) .

Siehe auch:

Mikel
quelle
4
Nur ein Kommentar, um zu unterstreichen, wie wichtig "oben in Ihrer Quelldatei" für diese Sprachdialektdefinitionen ist. Wenn sie nicht ganz oben sind, funktionieren sie nicht.
Dr. Person Person II
6

-Dist eine AC-Compiler-Option zum Definieren einer Präprozessorvariablen. In diesem Fall _XOPEN_SOURCE.

Dies wirkt sich nicht auf das Verhalten des Compilers selbst aus, sondern ändert das Verhalten einiger Bibliotheken, z. B. der Standard-c-Bibliothek. Es gibt verschiedene Möglichkeiten wie diese. In den meisten Fällen beziehen sie sich auf ein Standarddokument über eine UNIX-spezifische Programmierschnittstelle oder einen bestimmten Bibliotheksanbieter.

Das Definieren einer von ihnen ist manchmal erforderlich, da das Verhalten einiger Standardfunktionen oder sogar ihre Signatur zwischen den Standards unterschiedlich sein kann. Möglicherweise müssen Sie also -D_XOPEN_SOURCEetwas Ähnliches verwenden, um einen Kompatibilitätsmodus zu aktivieren.

Eine andere mögliche Verwendung dieser Flags besteht darin, sicherzustellen, dass Ihr Quellcode innerhalb der Grenzen eines bestimmten Standards bleibt, indem Sie die von Ihrer C-Bibliotheksimplementierung angebotenen Erweiterungen deaktivieren. Dies ist eine der Maßnahmen, mit denen Sie sicherstellen können, dass Ihr Code auf so vielen Plattformen wie möglich ausgeführt wird.

Davrieb
quelle
3

Dadurch wird der Header einer Definition einer bestimmten Norm wie Posix zugeordnet. Die tatsächliche Norm, zu der es gehört, wird durch den Wert definiert (hier zum Beispiel 400 oder 600). In dieser Referenz finden Sie Informationen zur Norm- / Wertebindung.

Aif
quelle
1

Aus einem unbekannten Grund benötigt Mac OS / X (XCode) 600, um strdup () zu definieren, obwohl es in der Spezifikation von 1995 enthalten ist. Mozilla und andere sind darauf gestoßen ...

jesup
quelle