Domanda

Sto scrivendo un codice semi-portatile e voglio essere in grado di rilevare quando sto compilando per iPhone. Quindi voglio qualcosa come #ifdef IPHONE_SDK ... .

Presumibilmente Xcode definisce qualcosa, ma non riesco a vedere nulla nelle proprietà del progetto e Google non è di grande aiuto.

È stato utile?

Soluzione

È contenuto nei documenti SDK in " Compilare il codice sorgente in modo condizionale "

Le definizioni pertinenti sono TARGET_OS_IPHONE (e ha deprecato TARGET_IPHONE_SIMULATOR), che sono definite in /usr/include/TargetConditionals.h all'interno del framework iOS. Nelle versioni precedenti della toolchain, dovevi scrivere:

#include "TargetConditionals.h"

ma questo non è più necessario sull'attuale toolchain (xCode 6 / iOS8).

Quindi, per esempio, se vuoi compilare un blocco di codice solo se stai costruendo per il dispositivo, allora dovresti farlo

#if !(TARGET_OS_SIMULATOR)
...
#endif

Altri suggerimenti

Per esaminare tutte le macro definite, aggiungilo a " Altre bandiere C " della tua configurazione build:

-g3 -save-temps -dD

Verranno visualizzati alcuni errori di compilazione, ma il compilatore scaricherà tutti i file definiti in file .mi nella directory principale del progetto. Puoi usare grep per guardarli, ad esempio:

grep define main.mi 

Al termine, non dimenticare di rimuovere queste opzioni dall'impostazione di creazione.

Le risposte a questa domanda non sono del tutto corrette. La questione della piattaforma e dell'hardware rispetto al simulatore è ortogonale.

Non usare l'architettura come scorciatoia per il rilevamento di piattaforme o simulatori! Questo tipo di pensiero sciatto ha causato molti, molti programmatori un gran bruciore di stomaco e mal di testa nel corso degli anni.

Ecco un diagramma ASCII dei condizionali. I nomi non hanno necessariamente senso per ragioni storiche:

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

Devices:      TARGET_OS_EMBEDDED
Simulators:   TARGET_OS_SIMULATOR

TARGET_OS_MAC è vero per tutte le piattaforme Apple.


TARGET_OS_OSX è vero solo per macOS

TARGET_OS_IPHONE è vero per iOS, watchOS e tvOS (dispositivi e simulatori)


TARGET_OS_IOS è vero solo per iOS (dispositivi e simulatori)

TARGET_OS_WATCH è vero solo per watchOS (dispositivi e simulatori)

TARGET_OS_TV è vero solo per tvOS (dispositivi e simulatori)


TARGET_OS_EMBEDDED è vero solo per hardware iOS / watchOS / tvOS

TARGET_OS_SIMULATOR è vero solo per il simulatore.


Noterò anche che puoi condizionare le impostazioni nei file xcconfig per piattaforma:

//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*] = ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top