Как определить, является ли компиляция для 64-разрядной iOS в Xcode
Рассмотрим следующую функцию
CGSize CGSizeIntegral(CGSize size)
{
return CGSizeMake(ceilf(size.width), ceilf(size.height));
}
CGSize
фактически состоит из двух изменений CGFloat
s и CGFloat
в зависимости от архитектуры:
typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit
Итак, приведенный выше код неверен в 64-битных системах и нуждается в обновлении с помощью чего-то вроде
CGSize CGSizeIntegral(CGSize size)
{
#if 64_bit
return CGSizeMake(ceil(size.width), ceil(size.height));
#else
return CGSizeMake(ceilf(size.width), ceilf(size.height));
#endif
}
Конечно, для этого макроса/константы компилятора (для Mac мы можем использовать INTEL_X86
, например), но я не смог найти это в 64-битном переход.
Как определить, для какой архитектуры строится?
Ответы
Ответ 1
Чтобы определить, компилируете ли вы для 64-разрядной версии, используйте __LP64__
:
#if __LP64__
return CGSizeMake(ceil(size.width), ceil(size.height));
#else
return CGSizeMake(ceilf(size.width), ceilf(size.height));
#endif
__LP64__
означает, что "longs and pointers являются 64-битными" и нейтральностью архитектуры.
В соответствии с вашим руководством по переходу оно применяется и для iOS:
Компилятор определяет макрос __LP64__
при компиляции для 64-битного во время выполнения.
Однако предпочтительный способ обработки вашего варианта использования - использовать CGFLOAT_IS_DOUBLE
. Нет гарантии, что __LP64__
всегда будет означать, что CGFloat
является двойным, но он будет гарантирован с помощью CGFLOAT_IS_DOUBLE
.
#if CGFLOAT_IS_DOUBLE
return CGSizeMake(ceil(size.width), ceil(size.height));
#else
return CGSizeMake(ceilf(size.width), ceilf(size.height));
#endif
Ответ 2
Для Swift и пренебрежения конкретным вопросом OP, связанным с CGFloats и т.д., следующее может быть более быстрым:
#if (arch(i386) || arch(arm))
.... // For 32-bit systems
#else
.... // For 64-bit systems
#endif
#if (arch(x86_64) || arch(arm64))
.... // For 64-bit systems
#endif
С другой стороны, константы времени компиляции, обсуждаемые в приведенном выше ответе, также доступны в Swift, если они предпочтительнее.
В основном это копируется здесь: fooobar.com/info/22438/...
И документы Apple об этих скоростных константах компиляции Swift находятся здесь:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html (в самой нижней части страницы).