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;

第三行应该如何重写以支持 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

This Stack Overflow answer from 2011 建议math.htgmath.h. 这将 的实现替换为fmax调用__typeof__每个参数并根据参数类型返回fmax或返回的实现。fmaxf

3.忽略这个问题

由于 CGFloats 与布局有关,将 a 存储float到 adouble中可能导致的数据丢失通常是微不足道的。也就是说,它们将代表像素的一小部分。

概括

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

4

1 回答 1

6

将 afloat转换为double. 这种转换总是准确的。

您的解决方案 1 和 2 在语义上完全等效,尽管 (2) 在风格上更正确。

您的解决方案 3 在形式上是不等价的;它可能会在 float 和 double 之间产生额外的转换,这可能会使其效率稍低(但实际结果是相同的)。

基本上,没关系,但使用tgmath.

于 2013-10-21T23:21:05.840 回答