考虑以下功能
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
所以,上述代码在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中找不到.
如何确定正在构建的体系结构?
解决方法
要确定是否正在编译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