【问题标题】:NSLog giving me warnings which are not correctableNSLog 给了我无法纠正的警告
【发布时间】:2012-11-13 06:28:39
【问题描述】:

我的 Mac OS X 应用程序中有以下代码行:

NSLog(@"number of items: %ld", [urlArray count]);

我收到警告:“格式指定类型 'long' 但参数的类型为 'NSUInteger'(又名 'unsigned int')”

但是,如果我将代码更改为:

NSLog(@"number of items: %u", [urlArray count]);

我收到警告:

Format 指定类型“unsigned int”,但参数的类型为“NSUInteger”(又名“unsigned long”)

然后我把它改成

NSLog(@"number of items: %u", [urlArray count]);

但我收到警告: Format 指定类型“unsigned long”,但参数的类型为“NSUInteger”(又名“unsigned int”)

如何设置我的 NSLog 使其不产生警告?如果我遵循 Xcode 的建议,我只会陷入更改格式说明符的无限循环,但警告永远不会消失。

【问题讨论】:

    标签: xcode cocoa nslog format-specifiers


    【解决方案1】:

    是的,这很烦人。我相信这是一个 32/64 位的东西。最简单的做法就是将其转换为 long:

    NSLog(@"number of items: %lu", (unsigned long)[urlArray count]);
    

    【讨论】:

      【解决方案2】:

      通用应用程序的portability guide 建议在这种情况下进行强制转换。

      NSLog(@"number of items: %ld", (unsigned long)[urlArray count]);
      

      【讨论】:

      • 这似乎没有必要,但它确实清除了警告。
      • 不确定它是否有所不同,但您可能应该使用与格式说明符相同的类型。所以 (unsigned long) 将是 %lu,或者 (long) 将是 %ld
      • @darren 它确实有所作为,不这样做是未定义的行为。
      • 来自可移植性指南:通常,在 32 位代码中,您使用 %d 说明符在 printf、NSAssert 和 NSLog 等函数以及 stringWithFormat: 等方法中格式化 int 值。但是对于 NSInteger,它在 64 位架构上的大小与 long 相同,您需要使用 %ld 说明符。除非您像 64 位一样构建 32 位,否则这些说明符会在 32 位模式下生成编译器警告。为避免此问题,您可以根据需要将值强制转换为 long 或 unsigned long。例如:NSInteger i = 34; printf("%ld\n", (long)i);
      【解决方案3】:

      这里提到了另一个选项:NSInteger and NSUInteger in a mixed 64bit / 32bit environment

      NSLog(@"Number is %@", @(number));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-23
        • 1970-01-01
        相关资源
        最近更新 更多