当前位置: 首页 > 面试题库 >

是否应使用条件编译来解决不同体系结构上CGFloat的差异?

白君之
2023-03-14
问题内容

在回答这个关于ceil()在CGFloat上为所有架构进行编译的早期问题时,我提出了以下解决方案:

    var x = CGFloat(0.5)

    var result: CGFloat

    #if arch(x86_64) || arch(arm64)
        result = ceil(x)
    #else
        result = ceilf(x)
    #endif

    // use result

(针对那些已经感到困惑的人的背景信息:对于32位架构,CGFloat是“ float”类型,对于64位架构(即,编译目标),CGFloat是“
double”,这就是为什么仅使用其中之一ceil()ceilf()不使用它的原因编译,具体取决于目标体系结构。请注意,您似乎无法CGFLOAT_IS_DOUBLE用于条件编译,只能使用体系结构标志…)

现在,有关在编译时与运行时修复问题等等的评论吸引了一些辩论。我认为我的回答被接受的太快了,以至于不能引起对此的一些好的辩论。

因此,我的新问题是:如果您希望iOS和OS X代码在32位和64位设备上运行,那么上述操作是安全,明智的做法吗?而且,如果这
理智而明智的,那么还有没有更好的解决方案(至少有效,而不是“棘手的”)?


问题答案:

马特

基于您的解决方案,并且如果您在多个地方使用它,那么稍加扩展可能会使它更可口:

extension CGFloat {
    var ceil: CGFloat {
        #if arch(x86_64) || arch(arm64)
            return ceil(x)
        #else
            return ceilf(x)
        #endif
    }
}

其余代码将更加简洁:

var x = CGFloat(0.5)
x.ceil


 类似资料:
  • 问题内容: 我对在x86主机上为ARM目标交叉编译Linux内核感兴趣。您推荐一些好的做法吗?您认为哪个是最好的交叉编译套件?您是否建立了自定义的交叉编译环境?如果是,您有什么建议?这是个好主意吗? 问题答案: 我为ARM / Linux工具使用了两种方法。最简单的方法是直接下载预构建的工具链。 优点 :它可以正常工作,您可以继续进行项目中有趣的部分。 缺点 :您选择了他们所选择的gcc / bi

  • 问题内容: 我正在为Windows编写一个Go程序,其中包含几个软件包。这些软件包之一是使用CGo调用在.h和.c文件中定义的一些函数。这些.c文件取决于windows.h。 由于在Windows平台上进行开发非常繁琐,因此我想对该文件中的功能进行建模,然后在Linux上进行开发。但是当我尝试编译时,我得到: 由于go工具会尝试编译与Windows相关的文件。有没有解决的办法?我知道把 并非最佳实

  • 我需要在跨平台应用程序套件上做出架构决策。我基本上想尝试解耦模块的新方法,并使用 ZeroMQ 实现网络 I/O,因为我知道它是进程内、进程间和网络应用程序的消息队列。但我不确定它如何适合我的情况。 如果有人能在我下周阅读他们那本有趣的书之前澄清几件事,我将不胜感激:http://zguide.zeromq.org/page:all 我已经检查了这些问题,但没有得到我的答案: 如何在桌面应用程序中

  • 我有以下一段代码: 我可以想象编译器具有消除函数中的子句所需的所有信息。调用该函数的唯一代码路径来自main,它接受,因此它应该能够确定该代码路径未被使用。但是: 在GCC 12.2中,我们看到第二部分链接到。 如果我函数,这将消失: 我在这里错过了什么?有没有办法让编译器做一些更智能的工作?这发生在带有 C 和 。

  • 我使用Android Jetpack的导航功能在屏幕之间导航。现在我想动态设置startDestination。 我有一个活动,叫做主活动和两个片段,片段 我想使用导航架构组件设置上述流程。目前我使用的StartDestination如下所示,但它不能满足我的要求。 是否可以使用Android导航架构组件有条件地设置startDestination?

  • 问题内容: 我有一个运行Linux Ubuntu的Freescale(i.MX53)的ARM Coretex-A8开发板。它可以正常启动,我可以使用鼠标/键盘/终端访问系统。 首先,我想让一个应用程序在主机OS内的板上运行,就像在PC上运行应用程序一样。 我的问题是,使用基于cc的YAGARTO之类的工具链来编译我的测试程序,因为我没有定义任何启动脚本,所以最终在链接方面遇到麻烦。 我发现了许多有