11

質問

次のようなレイアウト コードを検討してください。

CGFloat descriptionHeight = // height of a paragraph of text with zero or more words;
CGFloat imageHeight = // height of an image;
CGFloat yCoordinateOfSomeOtherView = fmax(descriptionHeight, imageHeight) + 5.0f;

3 行目は、64 ビット iOS デバイスのサポートでどのように書き直すべきですか?

yCoordinateOfSomeOtherView(現在のコードはが afloatか aかを考慮していませんdouble。)

オプション

いくつかのオプション (どれが最適かはわかりません):

1.独自のマクロを定義する

#if defined(__LP64__) && __LP64__
#define cgfmax(x,y) fmaxf(x,y)
#else
#define cgfmax(x,y) fmax(x,y)
#endif

その後、に置き換えることができましfmaxcgfmax

2.使用tgmath.h

2011 年のこのスタック オーバーフローの回答math.hでは、に置き換えることを提案していtgmath.hます。fmaxこれは、 の実装を、各引数を呼び出し、引数の型に応じてまたは__typeof__を返す実装に置き換えます。fmaxfmaxf

3. この問題を無視する

CGFloats はレイアウトに関連しているため、 を に格納する際に発生する可能性のあるデータ損失floatdouble、通常は重要ではありません。つまり、それらはピクセルのごく一部を表します。

概要

以前に 32 ビットから 64 ビットへの移行を行ったことがある人から、他のオプションや役立つアドバイスを探しています。

4

1 に答える 1

6

floatを に変換するときに「データ損失」が発生することはありませんdouble。その変換は常に正確です。

ソリューション1と2は意味的に完全に同等ですが、(2)はよりスタイル的に正しいです。

あなたの解決策3は正式には同等ではありません。float と double の間で余分な変換が発生する可能性があり、効率がわずかに低下する可能性があります (ただし、実際の結果は同じです)。

基本的には構いませんが、 を使用してtgmathください。

于 2013-10-21T23:21:05.840 に答える