【问题标题】:How to silence Xcode 64bit/32bit warnings, or better, fix them?如何使 Xcode 64 位/32 位警告静音,或者更好地修复它们?
【发布时间】:2014-01-10 15:52:51
【问题描述】:

代码:

#define ASSERT_INDEX_IS_WITHIN_BOUNDS(idx,array)
    NSAssert2(idx >= 0 && idx <= (self.array.count-1), @"index %d beyond bounds [0 .. %d]", idx, (self.array.count-1))

上述宏导致以下警告:

“NSUInteger”类型的值不应用作格式参数;改为向 'unsigned long' 添加显式强制转换。

这是在第三方代码中,其中有 LOADS 个。如何使它们静音/修复它们?

【问题讨论】:

  • 仅为 32 位构建?
  • @MichaelDautermann 瞄准 iPhone 5S。
  • 从长远来看,修复它们总是更好;)
  • @Daij-Djan - 但即使我们能找到“他们”,这合法吗? “他们”会包括 Kernighan 和 Ritchie 吗?

标签: ios c xcode macros


【解决方案1】:

您仍然可以在仅为 32 位构建它的 iPhone 5S 上运行该应用程序,因为 iPhone 5S 将运行现有的 32 位应用程序。许多应用程序需要等待开始构建 64 位,直到库供应商更新其代码以修复 64 位问题,并且在静态库的情况下,甚至需要包含其代码的 64 位构建。

据我所知,您现在没有任何理由绝对需要您的代码以 64 位运行,即使您这样做了,也无法保证您使用的第三方库的稳定性。所以我建议你暂时坚持只构建 32 位,它会在 iPhone 5S 上运行良好。

如果您出于某种原因确实需要能够为 64 位构建您的应用程序,则您必须让库供应商更新他们的代码,或者您必须将其删除并编写自己的代码处理他们正在做的事情的代码。

编辑:

要修正这个确切的警告,在它有%d 的地方,用%lu 替换它们。

【讨论】:

  • 我已经切换到 32 位 :P 但我仍然很好奇如何解决这个问题,因为这只是一个警告。
  • 警告可能是严重的问题。仅仅因为它仍然允许您编译它并不意味着它会正确运行,或者根本不会运行。事实上,即使没有任何警告的代码仍然可能无法工作。至于警告在抱怨什么,在这种特殊情况下,它似乎只是来自正在使用的格式字符串。但如果是第三方的代码,您可能希望他们修复它,否则如果您进行更改并且稍后想要使用它的更新版本同时保留您的一些更改,那么您会遇到很大的麻烦。
  • 一般来说是在谈论警告和编码实践。我想知道这个特定的警告是否可以永久修复/静音。
  • 会有一个编译器标志会使其静音,但它会使您自己的代码中的其他警告静音,这可能会使您很难看到其他实际问题。警告可能会在那个地方被阻止,但需要编辑该文件。它也可以修复,但同样需要编辑该文件。
  • 好的。那么……如果假设我要查看每个警告并修复它,我将如何修复它?
【解决方案2】:

使用 NSInteger/NSUInteger 可能会解决您的隐式转换警告。

我一直在我的代码中使用 int/long 类型。如果您需要同时支持 32 位和 64 位处理器,这是解决此问题的一种方法

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
    typedef long NSInteger;
    typedef unsigned long NSUInteger;
#else
    typedef int NSInteger;
    typedef unsigned int NSUInteger;
#endif

从 NSObjCRuntime.h 中可以看出,它基于 LP64(64 位)标志将 NS 类型转换为 unsigned/signed int/long

希望有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多