Question

J'écris du code semi-portable et je veux pouvoir détecter quand je compile pour iPhone. Donc, je veux quelque chose comme #ifdef IPHONE_SDK ... .

On peut présumer que Xcode définit quelque chose, mais je ne vois rien sous les propriétés du projet, et Google ne m'aide pas beaucoup.

Était-ce utile?

La solution

Il se trouve dans la documentation du SDK sous "Compiler le code source de manière conditionnelle"

.

Les définitions pertinentes sont TARGET_OS_IPHONE (et il a déconseillé TARGET_IPHONE_SIMULATOR), qui sont définies dans /usr/include/TargetConditionals.h dans la structure iOS. Sur les versions précédentes de la chaîne d’outils, vous deviez écrire:

#include "TargetConditionals.h"

mais cela n'est plus nécessaire dans la chaîne d'outils actuelle (xCode 6 / iOS8).

Ainsi, par exemple, si vous souhaitez compiler un bloc de code uniquement si vous créez pour le périphérique, vous devez alors procéder

.
#if !(TARGET_OS_SIMULATOR)
...
#endif

Autres conseils

Pour examiner toutes les macros définies, ajoutez-le à la section "Autres drapeaux C". de votre configuration de construction:

-g3 -save-temps -dD

Vous obtiendrez des erreurs de construction, mais le compilateur dumpera toutes les définitions dans des fichiers .mi dans le répertoire racine de votre projet. Vous pouvez utiliser grep pour les regarder, par exemple:

grep define main.mi 

Lorsque vous avez terminé, n'oubliez pas de supprimer ces options du paramètre de construction.

Les réponses à cette question ne sont pas tout à fait correctes. La question de la plate-forme et du matériel vs Simulator est orthogonale.

N'utilisez pas l'architecture en tant que raccourci pour la détection de plates-formes ou de simulateurs! Ce genre de réflexion négligée a causé de nombreux brûlures d'estomac et de nombreux maux de tête au fil des années.

Voici un tableau ASCII des conditions. Les noms n'ont pas nécessairement de sens pour des raisons historiques:

+--------------------------------------+
|             TARGET_OS_MAC            |
| +---+  +---------------------------+ |
| |   |  |      TARGET_OS_IPHONE     | |
| |OSX|  | +-----+ +----+ +-------+  | |
| |   |  | | IOS | | TV | | WATCH |  | |
| |   |  | +-----+ +----+ +-------+  | |
| +---+  +---------------------------+ |
+--------------------------------------+

Devices:      TARGET_OS_EMBEDDED
Simulators:   TARGET_OS_SIMULATOR

TARGET_OS_MAC est vrai pour toutes les plateformes Apple.

TARGET_OS_OSX est vrai uniquement pour macOS

TARGET_OS_IPHONE est vrai pour iOS, watchOS et tvOS (appareils et simulateurs)

TARGET_OS_IOS n'est vrai que pour iOS (appareils et simulateurs)

TARGET_OS_WATCH est vrai uniquement pour watchOS (appareils et simulateurs)

TARGET_OS_TV est vrai uniquement pour tvOS (appareils et simulateurs)

TARGET_OS_EMBEDDED est vrai uniquement pour le matériel iOS / watchOS / tvOS

TARGET_OS_SIMULATOR est vrai uniquement pour le simulateur.

Je noterai également que vous pouvez conditionner les paramètres des fichiers xcconfig par plate-forme:

//macOS only
SOME_SETTING[sdk=macosx] = ...

//iOS (device & simulator)
SOME_SETTING[sdk=iphone*] = ...
//iOS (device)
SOME_SETTING[sdk=iphoneos*] = ...
//iOS (simulator)
SOME_SETTING[sdk=iphonesimulator*] = ...

//watchOS (device & simulator)
SOME_SETTING[sdk=watch*] = ...
//watchOS (device)
SOME_SETTING[sdk=watchos*] = ...
//watchOS (simulator)
SOME_SETTING[sdk=watchsimulator*] = ...

//tvOS (device & simulator)
SOME_SETTING[sdk=appletv*] = ...
//tvOS (device)
SOME_SETTING[sdk=appletvos*] = ...
//tvOS (simulator)
SOME_SETTING[sdk=appletvsimulator*] = ...

// iOS, tvOS, or watchOS Simulator
SOME_SETTING[sdk=embeddedsimulator*] = ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top