考虑以下函数
CGSize CGSizeIntegral(CGSize size)
{
return CGSizeMake(ceilf(size.width), ceilf(size.height));
}
CGSize
实际上由两个组成CGFloat
s, and 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 位过渡指南 https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html.
我如何确定正在构建什么架构?
要确定您是否正在编译 64 位,请使用__LP64__
:
#if __LP64__
return CGSizeMake(ceil(size.width), ceil(size.height));
#else
return CGSizeMake(ceilf(size.width), ceilf(size.height));
#endif
__LP64__
代表“长整型和指针是 64 位”并且与体系结构无关。
根据您的转换指南,它也适用于 iOS:
编译器定义了__LP64__
编译 64 位时的宏
运行。
但是,处理您的用例的首选方法是使用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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)