禁止在Xcode中使用已弃用的警告


133

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

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

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


4
尽管Paul R的答案奏效,但认为Manicaesar更具手术性,因为它可以使您完全压制想要的警告,而不会丢失其他可能很重要的其他警告。在我看来,就最佳实践而言,manicaesar拥有The Correct Answer™
Olie

Answers:


82

尝试-Wno-deprecated-declarations使用Xcode或Xcode中的相应设置GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS(提示:只需在构建设置中键入“不赞成使用”即可找到此警告的特定设置)。

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

在此处输入图片说明


Xcode的古代版本(例如Xcode 2.x,3.x):

在此处输入图片说明


17
事实证明,这比这更容易。Xcode目标设置中有一个复选框;您的回答促使我在那搜索。谢谢!
Ben Gottlieb

4
您也可以按文件执行此操作。有关添加每个文件标志的信息,请参见以下答案:stackoverflow.com/a/6658549/272473
mrwalker 2012年

4
这样的答案令新手感到沮丧。在哪里尝试?如何找到目标设置?多一点解释将增加此答案的价值。
noogrub 2012年

8
这个解释不充分的答案不应被标记为正确。
克里斯·哈顿

6
在构建设置中搜索“已弃用”,您将看到它。
Quantumpotato 2014年

337

由于我还无法在@samiq帖子中添加评论,因此我想将其扩展。在使用不赞成使用的东西的函数/方法之前输入提及的指令。然后,您可以在函数定义结束后恢复先前的设置:

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

1
优秀的!这就是我想要的+1 :)
Zoran Simic

1
很棒的提示!太糟糕了,它不能在方法内部声明。
达斯汀

12
实际上,它可以在方法内部声明。由于docs / sdk中的错误,我今天只需要这样做
jer 2012年

6
+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]
Niclas 2014年

3
根据建议更改了:)
manicaesar 2014年

143

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

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

引用Clang 手册

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


1
最新版本的GCC使用相同的语法(用clang代替GCC)。
Niclas 2014年

3
我总是对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编译器。
serge-k

42

由于我们倾向于支持较旧的操作系统,但要注意我们的警告,因此,我希望使用一种更简洁的方法来做到这一点。我根据一些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之前版本的设备的支持时,您可以轻松地在代码中搜索以找到要修复的不赞成使用的方法。


对于大多数代码而言,这是一个比在全局/项目级别上减少弃用(或任何其他)警告更好的长期解决方案。很棒的答案。
natbro 2014年

1
为什么是do { ... } while(0);必需的?
Ben Leggiero

1
@ BenC.R.Leggiero,因为您没有在一个括号之间传递几个语句,而是传递了一个语句块。您基本上是在禁止每行警告。
亚历杭德罗·伊万

1
@AlejandroIván我知道您的解释对您来说很有意义...但是对我来说,好像您是在重新输入问题。您能否do{...}while(0);在这里特别说明为什么要这样做?为什么不只是{...}呢?为什么不if(true){...}呢?等
Ben Leggiero 2016年

2
@ BenC.R.Leggiero你是对的。由于某种原因,我误解了您的问题。这里检查接受的答案:stackoverflow.com/questions/154136/...
亚历杭德罗·伊万

29

您还可以使用以下命令禁止显示每个文件的警告

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

反过来,这使它比仅仅一次或全部抑制所有警告更好的做法……毕竟,您已经知道自己在做什么。


20

如果要使警告不再实现不赞成使用的方法不再实现不赞成使用的类,请使用:

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


当我看到“ -Wdeprecated-declarations”时,我猜必须有“ -Wdeprecated-implementations”。它确实有效。谢谢。
DawnSong

8

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

在此处输入图片说明


它将关闭所有“不推荐使用”的警告,但是,只需要禁止某些警告。
DawnSong

2

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

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

-3

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

#pragma clang system_header
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.