Welches Makro soll Mac OS X-spezifischen Code in C/C++ umschließen
Lesezeit: 6 Minuten
Beim Lesen verschiedener C- und C++-Quellen bin ich auf zwei Makros gestoßen __APPLE__ und __OSX__. Ich fand viel Verwendung von __OSX__ in verschiedenen Codes, insbesondere solche mit Ursprung *BSD Systeme.
Manchmal finde ich das jedoch testend __OSX__ allein reicht nicht und ich muss Tests mit absolvieren __APPLE__ Makro.
Benutzen #ifdef __GNUC__ um GCC-spezifischen Code zu umschließen.
Benutzen #ifdef __APPLE_CC__ jeden Mac OS X-spezifischen Code umschließen.
Wieder keine Erwähnung von __OSX__ Makro.
Welches Makro ist auf der Mac OS X-Plattform und der XCode-Entwicklungsumgebung vordefiniert, das verwendet werden sollte, um OSX-spezifischen Code in C/C++-Programmen zu unterscheiden?
Wo ist der, die, das __OSX__ Makro definiert? Ist es *BSD bestimmtes Makro?
Qt verwendet sogar eine andere Definition: Q_OS_OSX
Dieses Makro ist in jedem Apple-Computer definiert.
__APPLE_CC__
Dieses Makro wird auf eine ganze Zahl gesetzt, die die Versionsnummer des Compilers darstellt. Auf diese Weise können Sie beispielsweise zwischen Compilern unterscheiden, die auf derselben Version von GCC basieren, aber unterschiedliche Fehlerkorrekturen oder Funktionen aufweisen. Größere Werte bezeichnen spätere Compiler.
__OSX__
Vermutlich handelt es sich bei dem Betriebssystem um eine bestimmte Variante von OS X
Angesichts der obigen Definitionen würde ich also verwenden __APPLE__ apfelspezifischen Code zu unterscheiden.
Ja, ich verstehe den Unterschied von __APPLE__ und __APPLE_CC__ Makros – Ich habe von meinen Fragen auf dieselbe Anleitung verlinkt. Übrigens, Sie eingeschlossen __OSX__ Makro innerhalb des Zitats des Leitfadens und man kann verstehen, dass es sich um eine Erklärung aus dem verlinkten Leitfaden handelt, aber es ist Ihr Kommentar. Ich bin etwas verwirrt 🙂
– mloskot
30. Januar 2010 um 2:21 Uhr
@prewett: Ihr Punkt? Deshalb gibt es einen Link zur Apple-Dokumentation. Ich empfehle die Verwendung __APPLE__ in der obigen Antwort.
– Martin York
5. Oktober 2017 um 3:45 Uhr
@LokiAstari: Die Frage, die gestellt wurde, um MacOS X speziell zu bestimmen, aber __APPLE__ ist auch für iOS definiert. __OSX__ scheint das zu sein, was Sie wollen, also habe ich es verwendet und es hat nicht funktioniert, weil es nicht existiert und ich den Leuten die Mühe ersparen möchte. Tatsächlich ist diese Antwort (use __APPLE__) ist falsch, wenn Sie zwischen OS X und iOS unterscheiden wollen.
– vornässen
7. Oktober 2017 um 5:53 Uhr
@prewett Dann sollten Sie Ihre eigene Frage stellen (und beantworten), anstatt einer völlig anderen Frage unsinnige Kommentare hinzuzufügen. Hinweis: Diese Frage hat nichts mit iOS zu tun (was Sie feststellen können, weil sie gestellt und beantwortet wurde, bevor iOS existierte), noch hatte Ihr Kommentar etwas mit iOS zu tun, und die Apple-Dokumentation war nie spezifisch für die Bedeutung von __OSX__ (wie oben gezeigt).
Hier ist ein schöne Liste von Makros für Betriebssysteme.
Es gibt wenig Informationen darüber __OSX__ im Internet. Sie werden mit sicher sein __APPLE__.
+1 für Sie und Martin York. Vielen Dank! Allerdings bin ich immer noch sehr gespannt wo __OSX__ kommt von, also warte ich noch ein wenig mit dem Markieren meiner Frage als beantwortet.
– mloskot
30. Januar 2010 um 14:56 Uhr
schäbig
Benutzen
#if defined(__APPLE__) && defined(__MACH__)
um Apple-Betriebssysteme zu unterscheiden.
Sie können weiterverwenden TARGET_OS_MAC und TARGET_OS_IPHONE um zwischen macOS und iOS zu unterscheiden.
Einige Online-Listen von Compiler-Makros (wie diese hier) listen auf __MACOSX__. Einige Forenkommentare (wie diese) behaupten __OSX__ existiert. Diese sind falsch. Es gibt keine solchen Makros, die von OSX-Compilern vordefiniert sind, aber sie können von bestimmten Projekt-Makefiles und Plattform-Erkennungsskripten wie GNU autoconf definiert werden.
Dies sollte als akzeptierte Antwort ausgewählt werden. Auf diese Weise prüft der Swift-Compiler auch, ob das Betriebssystem ein Mac ist.
– Wowbagger und sein flüssiges Mittagessen
7. April um 11:09 Uhr
Sie können einfach die oberste Antwort bearbeiten, um die zusätzlichen Informationen in diese einzufügen, um sie zu verbessern. Es wird schwierig sein, diese Antwort auf eine 12 Jahre alte Frage höher zu stellen.
– Martin York
11. April um 16:35 Uhr
Paul R
Ich benutze normalerweise __MACH__ dafür. Es wurde seit der frühesten Version von OS X definiert (und vermutlich sogar davor).
Wenn Sie die Möglichkeit ausschließen möchten, dass Sie möglicherweise für ein anderes Betriebssystem kompilieren, das den Mach-Kernel verwendet, können Sie den Vorschlag von @ scravy verwenden:
#if defined(__APPLE__) && defined(__MACH__)
Beachten Sie auch, dass Sie, wenn Sie generischen C/C++-Code kompilieren, dh keine Apple-spezifischen Header, also nur an vordefinierten Compiler-Makros interessiert sind, diese wie folgt überprüfen können:
Qt verwendet sogar eine andere Definition:
Q_OS_OSX
– Mathematik
11. August 2015 um 14:26 Uhr