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.

Das Portieren von Befehlszeilen-Unix-Tools auf Mac OS X Führer spezifiziert __APPLE__ und zusätzlich __APPLE_CC__ aber tut nicht erwähnen __OSX__.

Das Portierung von GCC Führer sagt:

  • 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

    – Mathematik

    11. August 2015 um 14:26 Uhr

Benutzer-Avatar
Martin York

Es hängt alles ab.

Jedes Makro gibt etwas anderes in der Bedeutung an.
Sehen: https://developer.apple.com/library/mac/documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html#//apple_ref/doc/uid/TP40002850-SW13

__APPLE__

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).

    – Martin York

    7. Oktober 2017 um 6:43 Uhr


  • Benutzen #if defined(__APPLE__) && defined(__MACH__) – siehe meine Antwort unter stackoverflow.com/a/51539096/471478

    – schrullig

    11. April um 4:10

Benutzer-Avatar
Kornel Kisielewicz

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

Benutzer-Avatar
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.

Vollständiges Beispiel:

#if defined(__APPLE__) && defined(__MACH__)
    /* Apple OSX and iOS (Darwin). */
#include <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR == 1
    /* iOS in Xcode simulator */

#elif TARGET_OS_IPHONE == 1
    /* iOS */

#elif TARGET_OS_MAC == 1
    /* macOS */

#endif
#endif

Zur Frage bzgl “wo tut __OSX__ komme aus?”:

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.

Quelle: http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system

Update – der obige Link ist defekt, siehe Version im Webarchiv: https://web.archive.org/web/20180331065236/http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system#OSXiOSandDarwin

  • 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

Benutzer-Avatar
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:

$ gcc -dM -E - < /dev/null | egrep -i 'os_|mac|apple'
#define __APPLE_CC__ 6000
#define __APPLE__ 1
#define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ 120000
#define __ENVIRONMENT_OS_VERSION_MIN_REQUIRED__ 120000
#define __MACH__ 1
#define __VERSION__ "Apple LLVM 13.1.6 (clang-1316.0.21.2.3)"
#define __apple_build_version__ 13160021

Für alle, die auf diese Frage >= 2019 stoßen, habe ich festgestellt, dass es einen Header “Availability.h” gibt.

In diesem Header sind #defines wie:

#define __MAC_10_0            1000
#define __MAC_10_1            1010
#define __MAC_10_2            1020
#define __MAC_10_3            1030
#define __MAC_10_4            1040
#define __MAC_10_5            1050
#define __MAC_10_6            1060
#define __MAC_10_7            1070
#define __MAC_10_8            1080
#define __MAC_10_9            1090
#define __MAC_10_10         101000
#define __MAC_10_10_2       101002
#define __MAC_10_10_3       101003
#define __MAC_10_11         101100
#define __MAC_10_11_2       101102

Sie KÖNNEN also feststellen, ob Sie auf einer bestimmten MacOS-Plattform kompilieren.

Benutzer-Avatar
vornässen

Sehen http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system#OSXiOSandDarwin

#ifdef __APPLE__
#include <TargetConditionals.h>
#if TARGET_OS_MAC
   ...
#endif /* TARGET_OS_MAC */
#endif /* __APPLE__ */

Beachten Sie, dass __OSX__ tut NICHT existieren, zumindest ab Xcode 9.

Beachten Sie auch, dass dies der Fall ist #if TARGET_OS_MAC nicht #ifdef. Es ist immer definiert, ist aber 0, wenn es nicht macOS ist.

1012290cookie-checkWelches Makro soll Mac OS X-spezifischen Code in C/C++ umschließen

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

Privacy policy