replace“fabs”,“fmax”等以便在64位iOS设备上使用CGFloat

考虑这样的布局代码:

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; 

第三行如何重写支持64位iOS设备?

(当前的代码不考虑yCoordinateOfSomeOtherViewfloat还是double 。)

选项

几个选项(我不知道哪个是最好的):

1.定义我自己的macros

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

我可以用cgfmax代替fmax

2.使用tgmath.h

这个从2011年的堆栈溢出答案build议用tgmath.hreplacetgmath.h 这将用一个对每个参数调用__typeof__函数replacefmax的实现,并根据参数types返回fmaxfmaxf

3.忽略这个问题

由于CGFloats与布局相关,因此将float存储为float的数据丢失通常是微不足道的。 也就是说,它们将代表极小的像素分数。

概要

我正在寻找任何其他选项或从以前做过32位到64位转换的人的有用build议。

float转换为double时永远不会有任何“数据丢失”。 这个转换总是准确的。

你的解决scheme1和2在语义上是完全等价的,尽pipe(2)在风格上更为正确。

你的解决scheme3在forms上是不相同的。 它可能会导致float和double之间的额外转换,这可能会使效率稍微降低(但实际结果是相同的)。

基本上没关系,而是用tgmath