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?

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.

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

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

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.

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.
10122900cookie-checkWelches Makro soll Mac OS X-spezifischen Code in C/C++ umschließenyes
Qt verwendet sogar eine andere Definition:
Q_OS_OSX
– Mathematik
11. August 2015 um 14:26 Uhr