O # define são criadas por Xcode ao compilar para iPhone
-
02-07-2019 - |
Pergunta
Estou a escrever algum código semi-portáteis e quer ser capaz de detectar quando estou compilando para iPhone. Então eu quero algo como #ifdef IPHONE_SDK...
.
Presumivelmente Xcode define alguma coisa, mas eu não posso ver qualquer coisa sob propriedades do projeto, e Google não é de muita ajuda.
Solução
É na documentação SDK em "compilar o código fonte condicionalmente"
As definições relevantes são TARGET_OS_IPHONE (e ele obsoleta TARGET_IPHONE_SIMULATOR), que são definidos em /usr/include/TargetConditionals.h no âmbito iOS. Em versões anteriores do conjunto de ferramentas, você tinha que escrever:
#include "TargetConditionals.h"
mas isso não é mais necessário no atual (xCode 6 / iOS8) toolchain.
Assim, por exemplo, se você quiser compilar apenas um bloco de código se você está construindo para o dispositivo, então você deve fazer
#if !(TARGET_OS_SIMULATOR)
...
#endif
Outras dicas
Para olhar para todas as macros definidos, adicione aos "Outros Flags C" de sua configuração construção:
-g3 -save-temps -dD
Você vai ter alguns erros de compilação, mas o compilador vai despejar todas as define em arquivos .MI no diretório raiz do seu projeto. Você pode usar o grep para olhar para eles, por exemplo:
grep define main.mi
Quando estiver pronto, não se esqueça de remover estas opções a partir da configuração de compilação.
As respostas a esta pergunta não é totalmente correcta. A questão da plataforma e hardware vs Simulator é ortogonal.
Não use a arquitetura como um atalho para a detecção de plataforma ou simulador! Este tipo de pensamento desleixado tem causado muitos, muitos programadores muita azia e dor de cabeça ao longo dos anos.
Aqui está um gráfico ASCII dos condicionais. Os nomes não necessariamente faz sentido por razões históricas:
+--------------------------------------+
| TARGET_OS_MAC |
| +---+ +---------------------------+ |
| | | | TARGET_OS_IPHONE | |
| |OSX| | +-----+ +----+ +-------+ | |
| | | | | IOS | | TV | | WATCH | | |
| | | | +-----+ +----+ +-------+ | |
| +---+ +---------------------------+ |
+--------------------------------------+
Devices: TARGET_OS_EMBEDDED
Simulators: TARGET_OS_SIMULATOR
TARGET_OS_MAC é verdade para todas as plataformas da Apple.
TARGET_OS_OSX é verdade apenas para MacOS
TARGET_OS_IPHONE é verdade para iOS, watchOS e tvOS (dispositivos e simuladores)
TARGET_OS_IOS é verdade apenas para iOS (dispositivos e simuladores)
TARGET_OS_WATCH é verdade apenas para watchOS (dispositivos e simuladores)
TARGET_OS_TV é verdade apenas para tvOS (dispositivos e simuladores)
TARGET_OS_EMBEDDED é verdade apenas para iOS / watchOS / hardware tvOS
TARGET_OS_SIMULATOR é verdade apenas para o Simulator.
Eu também vai notar que você pode conditionalize configurações em arquivos xcconfig
por 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*] = ...