考虑以下功能
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
}
肯定有一个编译器宏/常量(例如对于Mac我们可以使用INTEL_X86
)但我无法在64-bit transition guide中找到它。
如何确定正在构建的体系结构?
答案 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(位于页面底部)。