2008-09-28 15 views

Respuesta

111

Es en la documentación de SDK bajo "Compilar código fuente condicionalmente"

Las definiciones relevantes son TARGET_OS_IPHONE (y él está desfasada TARGET_IPHONE_SIMULATOR), que se definen en /usr/include/TargetConditionals.h en el marco IOS. En las versiones anteriores de la cadena de herramientas, lo que tenía que escribir:

#include "TargetConditionals.h" 

pero esto ya no es necesario en el (6/iOS8 xCode) cadena de herramientas actual.

Así, por ejemplo, si desea que sólo compilar un bloque de código si usted está construyendo para el dispositivo, entonces usted debe hacer

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

incluyendo condicionales objetivo es exactamente lo correcto, a continuación, utilizar #ifdef TARGET_OS_IPHONE – kritzikratzi

+3

@kritzikratzi: #ifdef es incorrecto; debes usar #if. (El símbolo normalmente se define como 0 cuando no está en el simulador; #ifdef seguirá siendo verdadero.) – Andrew

+2

Para aquellos de ustedes que también pensaron que TARGET_OS_IPHONE es una forma de detectar dispositivos, no lo es. Significa que estás en iOS, puede ser simulador o iphone. TARGET_IPHONE_SIMULATOR es la forma de detectar dispositivo vs. simulador. (Sé que no está implícito en la respuesta, pero ver IPHONE conduce a mi error) –

24

para mirar todas las macros definidas, añadir esto a la "Otras banderas C" de su configuración construcción:

-g3 -save-temps -dD 

obtendrá algunos errores de generación, pero el compilador volcará todos los define en archivos .MI en el directorio raíz de su proyecto. Puede utilizar grep para mirarlos, por ejemplo:

grep define main.mi 

Cuando haya terminado, no se olvide de eliminar estas opciones de la configuración de generación.

+0

Gracias, esto fue útil –

+0

¡Impresionante! Gracias por eso. –

+4

tenga en cuenta que esto no funciona cuando se utiliza el compilador LLVM –

0

Las respuestas a esta pregunta no son del todo correctas. La cuestión de la plataforma y el hardware frente a Simulator es ortogonal.

¡No utilice la arquitectura como atajo para la detección de plataforma o simulador! Este tipo de pensamiento descuidado ha causado muchos, muchos programadores una gran cantidad de acidez estomacal y dolor de cabeza en los últimos años.

Aquí hay un gráfico ASCII de los condicionales. Los nombres no necesariamente tienen sentido por razones históricas:

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

Devices:  TARGET_OS_EMBEDDED 
Simulators: TARGET_OS_SIMULATOR 

TARGET_OS_MAC es cierto para todas las plataformas de Apple.


TARGET_OS_OSX es cierto sólo para MacOS

TARGET_OS_IPHONE es cierto para iOS, watchos, y TVOS (dispositivos & simuladores)


TARGET_OS_IOS es cierto sólo para iOS (dispositivos & simuladores)

TARGET_OS_WATCH es cierto solo para watchOS (dispositivos & simuladores)

TARGET_OS_TV es cierto sólo para TVOS (dispositivos & simuladores)


TARGET_OS_EMBEDDED es cierto sólo para hardware IOS/watchos/TVOS

TARGET_OS_SIMULATOR es cierto sólo para el simulador.


También voy en cuenta que puede condicionar la configuración en xcconfig archivos de la plataforma:

//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*] = ... 
Cuestiones relacionadas