【问题标题】:How can I get rid of an "unused variable" warning in Xcode?如何摆脱 Xcode 中的“未使用变量”警告?
【发布时间】:2011-03-27 17:57:42
【问题描述】:

我完全理解为什么会出现未使用的变量警告。我不想一般地压制它们,因为它们在大多数情况下都非常有用。但是,请考虑以下(人为的)代码。

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode 报告 saved 是一个未使用的变量,当然它不是。我怀疑这是因为NSAssert1 是一个宏。 NS_BLOCK_ASSERTIONS 宏是定义的,因此肯定启用了 Objective C 断言。

虽然它不会伤害任何东西,但我觉得它不整洁和烦人,我想压制它,但我不知道该怎么做。将变量分配给自身可以消除编译器警告,但如果存在这种情况,我宁愿以“正确”的方式进行操作。

【问题讨论】:

    标签: objective-c xcode compiler-warnings unused-variables


    【解决方案1】:

    我不确定新的 LLVM 编译器是否仍然支持它,但 GCC 有一个“未使用”属性可以用来抑制该警告:

    BOOL saved __attribute__((unused)) = [moc save:&error];
    

    或者(如果 LLVM 不支持上述内容),您可以将变量声明拆分为单独的行,以保证无论宏是否扩展,该变量都将被“使用”:

    BOOL saved = NO;
    saved = [moc save:&error];
    

    【讨论】:

      【解决方案2】:

      使用 Xcode 4.3.2 发现这似乎可行(少写)

      BOOL saved __unused;
      

      【讨论】:

      • 这对我不起作用,我收到'saved' was marked as unused but was used的警告
      【解决方案3】:

      在 Xcode 中,您可以为“未使用的变量”设置警告。转到目标的“构建设置”并使用“未使用”一词进行过滤

      这是截图:

      我建议您仅将其更改为 Debug。这样您就不会错过发布版本中的任何内容。

      【讨论】:

      • 您是否错过了问题中 Gregory 所说的“我一般不想压制它们,因为它们在大多数情况下非常有用”的部分?
      • @ShermPendley 无论如何,这仍然很有用,它回答了我关于如何在全球范围内关闭它的问题。
      • 关闭警告是错过错误的好方法。我强烈反对。
      • @orionelenzil - 是的,也不是。存在误报的真正接口问题。如果您没有到达使用变量的代码部分,则在您编写代码时会不断弹出警告。随着时间的推移,这将训练您忽略警告,这意味着您可能会错过更重要的错误。最好能够抑制正在积极编辑的代码块中的错误。
      • 嗨,如果我设置为 NO,它工作正常。但我的疑问是:我必须设置 Debug & Release NO ya only Unused Variable: NO?我必须设置哪一个。如果我设置为完全否,那么它在发布期间不会产生任何问题吗?
      【解决方案4】:
      NSError *error = nil;
      BOOL saved = [moc save:&error];
      NSAssert1(saved, @"Dude!!1! %@!!!", error);
      #pragma unused(saved)
      

      试试这样。 它对我有用。它也适用于你。

      【讨论】:

      • 这对我不起作用,我收到'saved' was marked as unused but was used的警告
      【解决方案5】:

      将变量标记为已使用的唯一简单且可移植的方法是……使用它。

      BOOL saved = ...;
      (void)saved; // now used
      

      不过,您可能会对已经描述的特定于编译器的扩展感到满意。

      【讨论】:

      • 比起上面描述的丑陋的#pragma,我更喜欢这个。
      • 嘿兄弟,不错的提示
      【解决方案6】:
      #pragma clang diagnostic push
      #pragma clang diagnostic ignored "-Wunused-variable"
          NSUInteger abc; /// Your unused variable
      #pragma clang diagnostic pop
      

      SOURCE

      【讨论】:

      • 这是最干净的方法,因为它只禁用那些#pragmas 之间的警告
      【解决方案7】:

      尝试使用:__unused 属性。在 Xcode 5 中工作

      【讨论】:

        【解决方案8】:

        这是您在 C 中执行此操作的方式,因此也是 Objective-C。

        即使您没有启用警告,将返回值标记为明确忽略总是一个好主意。它还向其他开发人员表明,您不仅忘记了返回值——您确实明确选择忽略它。

        (void)[moc save:&error];
        

        编辑:编译器会忽略对void 的强制转换,因此它不应该影响性能——它只是一个很好的干净的人工注释。

        【讨论】:

        • 在某些情况下,您必须使用此 hack 来编译 Objective-C 代码。使用(void) 是最清晰的方法,谢谢!
        【解决方案9】:

        您可以在“发布”

        上设置“否”LLVM 编译器 2.0 警告

        【讨论】:

          【解决方案10】:

          让它占据两行。将声明和默认值分开

          BOOL enabled = NO;
          
          // ...
          
          BOOL enabled;
          
          enabled = NO;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-09-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-04
            • 1970-01-01
            相关资源
            最近更新 更多