16

次の関数を検討してください

CGSize CGSizeIntegral(CGSize size)
{
    return CGSizeMake(ceilf(size.width), ceilf(size.height));
}

CGSizeは実際には 2 つ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
}

これには確かにコンパイラ マクロ/定数があります (INTEL_X86たとえば、Mac の場合に使用できます) が、64 ビット移行ガイドでこれを見つけることができませんでした。

どのアーキテクチャが構築されているかをどのように判断できますか?

4

2 に答える 2

33

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 are 64-bit」の略で、アーキテクチャに依存しません。

移行ガイドによると、iOS にも適用されます。

コンパイラは__LP64__、64 ビット ランタイム用にコンパイルするときにマクロを定義します。

ただし、ユース ケースを処理するための推奨される方法は、 を使用することCGFLOAT_IS_DOUBLEです。がdouble である__LP64__ことを常に意味するという保証はありませんが、 で保証されます。CGFloatCGFLOAT_IS_DOUBLE

#if CGFLOAT_IS_DOUBLE
    return CGSizeMake(ceil(size.width), ceil(size.height));
#else
    return CGSizeMake(ceilf(size.width), ceilf(size.height));
#endif
于 2013-09-17T22:48:33.393 に答える