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

考虑以下function

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

CGSize实际上由两个CGFloat组成, 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 } 

这当然有一个编译器的macros/常量(对于Mac,我们可以使用INTEL_X86 ),但是在64位转换指南中我一直没能find它。

我怎样才能确定正在构build的架构?

要确定您是否正在编译64位,请使用__LP64__

 #if __LP64__ return CGSizeMake(ceil(size.width), ceil(size.height)); #else return CGSizeMake(ceilf(size.width), ceilf(size.height)); #endif 

__LP64__代表“longs和指针是64位”,并且是架构中立的。

根据您的转换指南,它也适用于iOS:

编译器在为64位运行时编译时定义了__LP64__macros。

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

对于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 (位于页面的最底部)。