Was bedeutet -D_XOPEN_SOURCE?

Lesezeit: 3 Minuten

Benutzeravatar von anio
Anio

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 gefunden XOPEN_SOURCEaber es gab wenig Erklärung dessen, was es tut.

Kann bitte jemand näher darauf eingehen? Ich weiss -D_XOPEN_SOURCE kann auf unterschiedliche Werte eingestellt werden, wie z 400, 600aber was machen die?

Mikels Benutzeravatar
Mikel

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 Standards X/Open und POSIX definiert sind.

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

Die Nummern 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 aufgerufene Funktion ansehen.

Zum Beispiel, man strdup sagt:

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

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

Das bedeutet, dass Sie eines davon einsetzen sollten:

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

am Anfang Ihrer Quelldatei, bevor Sie etwas tun #includes, wenn Sie verwenden möchten strdup.

Oder Sie könnten setzen

#define _GNU_SOURCE

dort, was alle Funktionen aktiviert, mit dem Nachteil, dass es möglicherweise nicht unter Solaris, FreeBSD, Mac OS X usw. kompiliert werden kann.

Es ist eine gute Idee, jede Manpage zu überprüfen, bevor Sie eine #include, #defineoder eine neue Funktion verwenden, da sich ihr Verhalten manchmal ändert, je nachdem, welche Optionen und #defines Sie haben zum Beispiel mit Basisname(3).

Siehe auch:

  • Nur ein Kommentar, um zu unterstreichen, wie wichtig “am Anfang Ihrer Quelldatei” für diese Sprachdialektdefinitionen ist. Wenn sie nicht ganz oben stehen, funktionieren sie nicht.

    – SO stinkt

    4. Januar 2016 um 19:45 Uhr

  • @Mikel separate Frage, was muss definiert werden, um POSIX 2017 zu erhalten?

    – pevik

    17. Februar um 8:09 Uhr

Benutzeravatar von davrieb
davrieb

-D ist eine Compileroption zum Definieren einer Präprozessorvariablen. In diesem Fall _XOPEN_SOURCE.

Dies wirkt sich nicht wirklich auf das Verhalten des Compilers selbst aus, sondern ändert eher das Verhalten einiger Bibliotheken, zB der Standard-C-Bibliothek. Es gibt mehrere Optionen wie diese. In den meisten Fällen beziehen sie sich auf ein Standarddokument über eine UNIX-spezifische Programmierschnittstelle oder einen bestimmten Bibliotheksanbieter.

Manchmal ist es notwendig, eine davon zu definieren, da sich das Verhalten einiger Standardfunktionen oder sogar ihre Signatur zwischen den Standards unterscheiden kann. Sie müssen also möglicherweise verwenden -D_XOPEN_SOURCE oder etwas ähnliches, um einen Kompatibilitätsmodus einzuschalten.

Eine weitere mögliche Verwendung dieser Flags besteht darin, sicherzustellen, dass Ihr Quellcode innerhalb der Grenzen eines bestimmten Standards bleibt, indem Sie Erweiterungen deaktivieren, die von Ihrer C-Bibliotheksimplementierung angeboten werden. 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.

Dadurch wird die Zugehörigkeit des Headers zu einer Definition einer bestimmten Norm, wie z. B. Posix, offengelegt. Die eigentliche Normzugehörigkeit wird durch den Wert definiert (hier zB 400 oder 600). Sieh dir das an Bezug für die Norm/Wert-Bindung.

Aus unbekannten Gründen benötigt Mac OS/X (XCode) 600, um strdup() zu definieren, obwohl es in der Spezifikation von 1995 enthalten ist. Mozilla und Andere bin darauf gestoßen…

1422060cookie-checkWas bedeutet -D_XOPEN_SOURCE?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy