【问题标题】:What do I need to do to use tgmath on iOS?我需要做什么才能在 iOS 上使用 tgmath?
【发布时间】:2014-03-08 08:56:27
【问题描述】:

我正在编译我的第一个启用 64 位支持的项目。我遇到了一堆关于隐式转换为浮点的编译器警告。发生这种情况是因为我正在使用 fabsf() 并将结果分配给 CGFloat(这是一个双精度,而不是在新的 64 位架构上浮动)。

根据这个问题的答案:

CGFloat-based math functions?

我只需要#include <tgmath.h> 来解决这个问题,并且可能将fabsf 更改为fabs。我至少有一个文件似乎没有帮助。我仍然收到警告:implicit conversion loses floating-point precision 'double' to 'CGFloat' aka (float). 这是生成该警告的行:

CGFloat deltaX = fabs(item.center.x-point.x);

有没有其他人遇到过这个?你是怎么解决的?我宁愿不禁用这个警告,也不想用大量的类型转换乱扔我的代码。

【问题讨论】:

    标签: ios arm64 tgmath


    【解决方案1】:

    我猜,您使用的是 CGPoint 类型,因此转换不会发生在 fabs(DOUBLE -> FLOAT) 中,而是在分配 CGFloat = DOUBLE 时发生。这可能是因为编译器使用了 math.h 中的 fabs,它对双精度进行操作。

    math.h 的问题在于它是由 OSX 标头在内部导入的(如果我没记错的话是碳),所以我猜一些 iOS 标头也可能这样做。快速查看后,似乎基本框架集没有导入 math.h,因此您可能应该寻找它是手动导入的。如果它是由某些系统库在内部导入的,您可能无法在单个实现文件中使用这些库和 tgmath。

    如果你想检查是否有一些 math.h 依赖项,你可以使用一个肮脏的技巧来防止它被包含 - 将此行添加到文件中(或者更好地添加到前缀文件顶部):

    #define __MATH_H__
    

    【讨论】:

    • 是的,在我的问题示例中,我直接访问 CGPoint 的 x/y 字段。在这种情况下,如果我对文件进行预处理,我看不到 tgmath fabs 宏在使用它的位置展开。我已经清楚地在这个文件中包含了 tgmath.h。查看预处理的文件,它会生成这些新的@import 行之一。
    • 我发现在 pch 中导入tgmath.h 会影响行为的改变。也就是说,有问题的行被预处理为CGFloat deltaX = __tg_fabs((__typeof__(__tg_promote((item.center.x-point.x))))(item.center.x-point.x));,这是我在有问题的文件中导入tgmath.h 所期望的。感谢您的帮助!
    【解决方案2】:

    通过在我的 PCH 文件顶部包含标题,我能够使 tgmath.h 函数工作。

    在某些时候(阅读:Xcode 更新),我不得不开始禁用模块以使其正常工作。此类的详细信息在下面的question Dima 链接中。

    【讨论】:

    • 我有没有一种简单的方法可以检查这是否真的有效?这样做之后,我仍然收到强制转换警告,并且 cmd+单击函数声明仍然会将我带到 math.h 而不是 tgmath.h。因此,这似乎不起作用。
    • 在弄乱了我的项目设置之后,我终于能够通过删除“启用模块”设置来让它工作。不知道为什么会这样,所以我要提出一个新问题。
    • @Dima 实际上我也遇到了同样的问题。我不记得它是什么时候开始的,如果它是在特定的 Xcode 版本之后,但你建议的正是我处理它的确切方式。为在此处包含信息而欢呼。我也会补充我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2012-07-13
    • 2021-07-22
    • 2021-08-14
    • 1970-01-01
    • 2016-11-29
    相关资源
    最近更新 更多