【问题标题】:Suppressing deprecated warnings in Xcode抑制 Xcode 中已弃用的警告
【发布时间】:2011-02-06 23:58:15
【问题描述】:

由于所有 SDK 都随处可见,因此能够为多个 SDK 和平台进行构建非常方便。但是,从 3.2 跳到 3.0,甚至偶尔跳到 2.x,我经常收到涉及已更改或被取代的方法的弃用警告:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

由于我仍然想保持与旧操作系统的兼容性,并且我也在努力消除构建时的“噪音”,有没有办法关闭或禁用这些警告?

【问题讨论】:

  • 虽然 Paul R 的回答有效,但考虑到 manicaesar 更具外科手术性,因为它允许您完全抑制您想要的警告,而不会丢失其他可能很重要的附加警告。在我看来,就最佳实践而言,manicaesar 拥有 The Correct Answer™

标签: iphone xcode macos warnings


【解决方案1】:

由于我还不能在@samiq 帖子中添加评论,我想我会扩展它。在使用不推荐使用的东西的函数/方法之前输入提到的指令。那么就可以在函数结束定义后恢复之前的设置:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma GCC diagnostic pop

【讨论】:

  • 太棒了!这就是我想要的 +1 :)
  • 很棒的提示!太糟糕了,它不能在方法中声明。
  • 其实可以在方法中声明。由于 docs/sdk 中的错误,我今天不得不这样做
  • +1 稍微好一点的方法是使用#pragma GCC diagnostics push #pragma GCC diagnostics ignored "-Wdeprecated-declarations" .. .. Code here .. .. #pragma GCC diagnostic pop 的语法,因为这种方法会带您回到之前设置的任何设置.. [gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html]
  • 根据建议更改:)
【解决方案2】:

Clang 提供了一个很好的功能,它使@manicaesar 帖子中的“恢复”步骤独立于初始警告状态:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma clang diagnostic pop

引用 Clang manual:

除了 GCC 的 pragma 提供的所有功能外,Clang 还允许您推送和弹出当前警告状态。这在编写将由其他人编译的头文件时特别有用,因为您不知道他们使用什么警告标志构建。

【讨论】:

  • 最新版本的 GCC 使用相同的语法(用 clang 代替 GCC)。
  • 我总是对什么是 LLVM、GCC 和 Clang 感到困惑。所以,我想写个便条以节省时间。 GNU Complier Collection (GCC) 与 Xcode 3 一起使用,然后 Apple 发布了带有混合 LLVM-GCC 的 Xcode 4。然后低级虚拟机 (LLVM) 编译器接管,请参阅llvm.org 的更多信息。从 Xcode 7.2.1 开始,默认编译器是 Apple LLVM 7.0。 LLVM 编译器是其他“项目”、调试器和其他工具的库,其中包括 Clang 本机编译器。 Clang 是一个“LLVM 原生”C/C++/Objective-C 编译器。
【解决方案3】:

试试-Wno-deprecated-declarations,或者它在Xcode中的相应设置GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS(专业提示:只需在构建设置中输入“deprecated”即可找到此警告的具体设置)。

Xcode 的当前版本(例如 Xcode 9.2):


Xcode 的旧版本(例如 Xcode 2.x、3.x):

【讨论】:

  • 事实证明它比这更容易; Xcode 目标设置中有一个复选框;你的回答促使我在那里搜索。谢谢!
  • 您也可以在每个文件的基础上执行此操作。请参阅此答案以添加每个文件标志:stackoverflow.com/a/6658549/272473
  • 这样的答案让新手感到沮丧。去哪里试试?如何找到目标设置?多一点解释会增加这个答案的价值。
  • 不应将这个解释不清的答案标记为正确。
  • 在构建设置中搜索“已弃用”,您会看到它。
【解决方案4】:

由于我们往往需要支持较旧的操作系统,但请注意我们的警告,我想要一种更整洁的方式来做到这一点。受到一些 Mozilla 代码的启发,我把它放在一起:

#define SILENCE_DEPRECATION(expr)                                   \
do {                                                                \
_Pragma("clang diagnostic push")                                    \
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")   \
expr;                                                               \
_Pragma("clang diagnostic pop")                                     \
} while(0)

#define SILENCE_IOS7_DEPRECATION(expr) SILENCE_DEPRECATION(expr)
#define SILENCE_IOS8_DEPRECATION(expr) SILENCE_DEPRECATION(expr)

这允许您执行以下操作:

SILENCE_IOS7_DEPRECATION(return [self sizeWithFont:font constrainedToSize:size]);

它也适用于代码块:

SILENCE_IOS7_DEPRECATION(
    view = [[MKPolylineView alloc] initWithPolyline:self];
    view.lineWidth = self.lineWidth;
    view.strokeColor = self.color;
);

此外,当您放弃对 iOS 7 之前的设备的支持时,您可以轻松搜索代码以找到要修复的弃用用法。

【讨论】:

  • 对于大多数代码来说,这是一个比在全局/项目级别限制弃用(或任何其他)警告更好的长期解决方案。很棒的答案。
  • 为什么需要do { ... } while(0);
  • @BenC.R.Leggiero 因为你不是在传递一个块,而是在这些括号之间传递几个语句。您基本上是在禁止每一行的警告。
  • @AlejandroIván 我知道你的解释对你来说很有意义......但对我来说,看起来你正在重新措辞这个问题。你能解释一下为什么这里特别需要do{...}while(0);吗?为什么不只是{...}?为什么不if(true){...}?等
  • @BenC.R.Leggiero 你是对的。出于某种原因,我误读了您的问题。在此处查看接受的答案:stackoverflow.com/questions/154136/…
【解决方案5】:

您还可以使用

来抑制每个文件的警告
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

这反过来又使它比仅仅同时抑制所有警告更好一点……毕竟你知道你在做什么。

【讨论】:

    【解决方案6】:

    如果您想消除警告实现不推荐使用的方法实现不推荐使用的类,请使用:

    #pragma clang 诊断推送 #pragma clang 诊断忽略“-Wdeprecated-implementations” // 代码 #pragma clang 诊断弹出

    【讨论】:

    • 当我看到“-Wdeprecated-declarations”时,我想一定有“-Wdeprecated-implementations”。它确实有效。谢谢。
    【解决方案7】:

    在您的构建设置中,找到Deprecated Functions

    【讨论】:

    • 它会关闭所有“弃用”的警告,但是,只有一些警告需要被禁止。
    【解决方案8】:

    如果您想全面检查一段代码中的各种弃用情况。请使用 -Wdeprecated 标志,如下所示:

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated"
    - (void) methodUsingDeprecatedStuff {
        //use deprecated stuff
    }
    #pragma clang diagnostic pop
    

    【讨论】:

      【解决方案9】:

      要禁用来自第三方头文件的警告,请在文件顶部添加以下行

      #pragma clang system_header
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-03
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 2019-01-13
        • 2015-06-16
        • 2023-03-22
        相关资源
        最近更新 更多