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 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
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 #include
Sie 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
, #define
oder eine neue Funktion, denn manchmal ihr Verhalten auf , welche Optionen in Abhängigkeit davon ändert und #define
s Sie haben zum Beispiel mit Basisnamen (3) .
Siehe auch:
-D
ist 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_SOURCE
etwas Ä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.
quelle
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.
quelle
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 ...
quelle