Какие #defines настраиваются Xcode при компиляции для iPhone

Я пишу какой-то полу-портативный код и хочу быть в состоянии обнаружить, когда компилирую iPhone. Поэтому я хочу что-то вроде #ifdef IPHONE_SDK....

Предположительно Xcode что-то определяет, но я ничего не вижу в свойствах проекта, и Google не очень помогает.

Ответ 1

Это в документах SDK в разделе "Компиляция исходного кода условно"

Соответствующие определения: TARGET_OS_IPHONE (и он устарел TARGET_IPHONE_SIMULATOR), которые определены в /usr/include/TargetConditionals.h в рамках iOS. В более ранних версиях инструментальной цепочки вам нужно было написать:

#include "TargetConditionals.h"

но это больше не нужно для текущей (xCode 6/iOS8) toolchain.

Итак, например, если вы хотите только скомпилировать блок кода, если вы строите устройство, то вам следует сделать

#if !(TARGET_OS_SIMULATOR)
...
#endif

Ответ 2

Чтобы просмотреть все определенные макросы, добавьте это в "Другие флаги C" вашего конфигурационного файла:

-g3 -save-temps -dD

Вы получите некоторые ошибки сборки, но компилятор сбрасывает все определения в .mi файлы в корневой каталог проекта. Вы можете использовать grep, чтобы посмотреть на них, например:

grep define main.mi 

Когда вы закончите, не забудьте удалить эти параметры из настройки сборки.

Ответ 3

Ответы на этот вопрос не совсем правильны. Вопрос о платформе и аппаратных средствах против Simulator является ортогональным.

Не используйте архитектуру в качестве ярлыка для обнаружения платформы или симулятора!. Такое небрежное мышление за многие годы вызвало у многих и многих программистов много изжоги и головной боли.

Вот график ASCII условных обозначений. Имена не обязательно имеют смысл по историческим причинам:

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

Devices:      TARGET_OS_EMBEDDED
Simulators:   TARGET_OS_SIMULATOR

TARGET_OS_MAC верен для всех платформ Apple.


TARGET_OS_OSX верен только для macOS

TARGET_OS_IPHONE истинно для iOS, watchOS и tvOS (устройств и симуляторов)


TARGET_OS_IOS действует только для iOS (устройств и симуляторов)

TARGET_OS_WATCH верен только для watchOS (устройства и симуляторы)

TARGET_OS_TV истинно только для tvOS (устройства и симуляторы)


TARGET_OS_EMBEDDED истинно только для оборудования iOS/watchOS/tvOS

TARGET_OS_SIMULATOR является истинным только для симулятора.


Также я хочу отметить, что вы можете условно настроить параметры в файлах xcconfig на платформе:

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