web-dev-qa-db-fra.com

Quelle macro pour envelopper du code spécifique à Mac OS X en C / C ++

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?

41
mloskot

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.

23
Martin York

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

13
Kornel Kisielewicz

J'utilise normalement __MACH__ pour ça. Il a été défini depuis la première version d'OS X (et même avant, probablement).

4
Paul R

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.

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

2
scravy

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.

1
SMGreenfield

Voir 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__ */

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.

1
prewett