Lors de la lecture de diverses sources C et C++, j'ai rencontré deux macros __Apple__
et __OSX__
. J'ai trouvé beaucoup d'utilisation de __OSX__
dans divers codes, notamment ceux provenant de *BSD
systèmes.
Cependant, parfois je trouve que tester __OSX__
n'est pas suffisant et je dois effectuer des tests avec __Apple__
macro.
Les guides Portage des outils Unix de ligne de commande vers Mac OS X spécifient __Apple__
et en plus __Apple_CC__
mais ne mentionne pas __OSX__
.
Le guide Portage depuis GCC dit:
- Utilisation
#ifdef __GNUC__
pour encapsuler tout code spécifique à GCC.- Utilisation
#ifdef __Apple_CC__
pour encapsuler tout code spécifique à Mac OS X.
Encore une fois, aucune mention de __OSX__
macro.
Quelle macro est prédéfinie sur la plate-forme Mac OS X et l'environnement de développement XCode à utiliser pour distinguer le code spécifique à OSX dans les programmes C/C++?
Où est le __OSX__
macro définie? Est-ce *BSD
macro spécifique?
Tout dépend.
Chaque macro spécifie quelque chose de différent dans sa signification.
Voir: https://developer.Apple.com/library/mac/documentation/Porting/Conceptual/PortingUnix/compiling/compiling.html#//Apple_ref/doc/uid/TP40002850-SW1
__Apple__
Cette macro est définie dans n'importe quel ordinateur Apple.
__Apple_CC__
Cette macro est définie sur un entier qui représente le numéro de version du compilateur. Cela vous permet de distinguer, par exemple, des compilateurs basés sur la même version de GCC, mais avec des corrections de bogues ou des fonctionnalités différentes. Des valeurs plus élevées indiquent des compilateurs ultérieurs.
__OSX__
Vraisemblablement, le système d'exploitation est une variante particulière d'OS X
Donc, étant donné les définitions ci-dessus, j'utiliserais __Apple__
pour distinguer Apple code spécifique.
Voici une Nice list de macros pour les systèmes d'exploitation.
Il y a peu d'informations sur __OSX__
sur le Web. Vous serez en sécurité avec __Apple__
.
J'utilise normalement __MACH__
pour ça. Il a été défini depuis la première version d'OS X (et même avant, probablement).
Utilisation
#if defined(__Apple__) && defined(__MACH__)
pour distinguer Apple MacOS (pas iOS).
Concernant le "d'où vient [~ # ~] osx [~ # ~] ":
Quelques listes en ligne de macros de compilation (comme celle-ci) list
__MACOSX__
. Certains commentaires sur le forum (comme ceux-ci) affirment__OSX__
existe. Ce sont incorrects. Il n'y a pas de telles macros prédéfinies par les compilateurs OSX, mais elles peuvent être définies par des Makefiles de projet spécifiques et des scripts de détection de plateforme comme GNU autoconf.
Pour tous ceux qui rencontrent cette question> = 2019, j'ai trouvé qu'il y a un en-tête "Availability.h".
Dans cet en-tête, sont #defines comme:
#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
Vous pouvez donc savoir si vous compilez sur une plate-forme MacOS particulière.
#ifdef __Apple__
#include <TargetConditionals.h>
#if TARGET_OS_MAC
...
#endif /* TARGET_OS_MAC */
#endif /* __Apple__ */
Notez que __OSX__
existe-t-il [~ # ~] pas [~ # ~] existe, au moins depuis Xcode 9.
Notez également qu'il s'agit de #if TARGET_OS_MAC
ne pas #ifdef
. Il est toujours défini, mais vaut 0 lorsqu'il n'est pas macOS.