如何确定是否编译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 (位于页面的最底部)。