考虑以下功能
CGSize CGSizeIntegral(CGSize size) { return CGSizeMake(ceilf(size.width),ceilf(size.height)); }
CGSize实际上由两个CGFloats组成,CGFloat的定义取决于架构:
typedef float CGFloat;// 32-bit typedef double CGFloat;// 64-bit
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中找不到.
如何确定正在构建的体系结构?
解决方法
要确定是否正在编译64位,请使用__LP64__:
#if __LP64__ return CGSizeMake(ceil(size.width),ceilf(size.height)); #endif
__LP64__代表“longs和指针是64位”,并且是架构中立的.
根据您的转换指南,它也适用于iOS:
The compiler defines the
__LP64__
macro when compiling for the 64-bit
runtime.
但是,处理用例的首选方法是使用CGFLOAT_IS_DOUBLE.不能保证__LP64__总是意味着CGFloat是一个双重的,但它将保证用CGFLOAT_IS_DOUBLE.
#if CGFLOAT_IS_DOUBLE return CGSizeMake(ceil(size.width),ceilf(size.height)); #endif