替换`fabs`,`fmax`等,以便在64位iOS设备上与CGFloat一起使用

Aar*_*ger 11 cocoa-touch objective-c cgfloat ios

考虑这样的布局代码:

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;
Run Code Online (Sandbox Code Playgroud)

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

(当前代码不考虑yCoordinateOfSomeOtherView是a float还是a double.)

选项

一些选项(我不确定哪个是最好的):

1.定义我自己的宏

#if defined(__LP64__) && __LP64__
#define cgfmax(x,y) fmaxf(x,y)
#else
#define cgfmax(x,y) fmax(x,y)
#endif
Run Code Online (Sandbox Code Playgroud)

然后我可以代替fmax使用cgfmax.

2.使用 tgmath.h

2011年的Stack Overflow回答建议替换math.htgmath.h.这取代了fmax一个调用__typeof__每个参数并返回fmax或者fmaxf根据参数类型返回的实现.

3.忽略此问题

由于CGFloats与布局有关,因此将a存储float到a中的数据丢失double通常是微不足道的.也就是说,它们将代表微小的像素部分.

摘要

我正在寻找之前完成32位到64位转换的人的任何其他选项或有用建议.

Ste*_*non 6

将a转换float为a 时,从未发生任何"数据丢失" double.转换总是准确的.

您的解决方案1和2在语义上完全等同,但(2)在风格上更正确.

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

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