如何确定是否在Xcode中编译64位iOS

时间:2013-09-17 22:39:14

标签: ios 32bit-64bit ios7

考虑以下功能

CGSize CGSizeIntegral(CGSize size)
{
    return CGSizeMake(ceilf(size.width), ceilf(size.height));
}

CGSize实际上包含两个CGFloatCGFloat的定义更改取决于架构:

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-bit transition guide中找到它。

如何确定正在构建的体系结构?

2 个答案:

答案 0 :(得分:30)

要确定您是否正在编译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 is 64-bit”,并且是架构中立的。

根据您的过渡指南,它也适用于iOS:

  

编译64位时,编译器定义__LP64__宏   运行时。

但是,处理用例的首选方法是使用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

答案 1 :(得分:3)

对于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中找到,如果它们是首选的话。

这主要是从这里复制的:https://stackoverflow.com/a/24869607/253938

关于这些Swift编译时常量的Apple文档在这里: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html(位于页面底部)。