Как определить, является ли компиляция для 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 (в самой нижней части страницы).