使用LLVM/Clang忽略特定文件中的所有警告

78

我在我的iOS项目中有一些文件出现了一些警告,我想要忽略这些警告。我不想禁用整个项目的警告(我知道如何做到这一点),只想忽略一些特定的文件。那么,有没有一种方法可以完全忽略来自特定文件的所有警告?

我正在使用Xcode 4.2上的LLVM 3.0和Clang。


这些源代码是你自己的还是项目中别人的?如果是别人的,最好的方法可能是将它们放在一个静态库中并进行链接。 - Steven Fisher
这里给出的答案非常优雅:https://dev59.com/RGw05IYBdhLWcg3w9mdW - Oded Ben Dov
4个回答

98

我继承了一个包含大量320代码的项目,该代码库对我抛出了多个警告和静态分析错误,但由于我将很快从项目中删除该代码,所以我对修复这些问题没有兴趣。

你可以通过包含以下编译器标志来禁用特定文件的静态分析警告:

-Xanalyzer -analyzer-disable-all-checks
你可以与-w结合使用,以便禁用该文件的警告。这使我能够在推进新开发时不被那个代码库生成的30多个警告所困扰。
按照上面的说明,要使用Xcode来修改文件的构建标志:
1. 选择目标 2. 选择构建阶段 3. 找到要修改参数的文件,在“编译源”阶段中进行修改 4. 双击其“编译器标志”单元格进行编辑 5. 添加“-w -Xanalyzer -analyzer-disable-all-checks”以抑制警告和clang警告

太棒了。非常感谢你提供的编译器标志,正是我所需要的。 - Mike A
4
较新版本的clang(例如iOS6中的4.x)似乎已经将此选项-Xclang -analyzer-disable-checker取消。 - orj
3
“-Xanalyzer”格式在我新安装的XCode(版本4.5.1,IOS6)中仍然有效。另一种格式无法工作。 - fishinear
1
这在XCode 4.5.2中有效,用于禁用第三方源(RegexKitLite.m)中的“+的右操作数是垃圾值”(Bug Report)。 接受的答案没有起作用。 更新此答案以说明-Xanalyzer,-w和-analyzer-disable-checker之间的区别将会很有帮助。 - Goffredo

74

如果您只使用clang,则应针对您维护的源文件使用pragma语法(假设通过适当修改程序无法删除警告)。

这里是语法:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"

char b = 'df'; // no warning.

#pragma clang diagnostic pop
如果这些程序是您无法更改且不维护的,则应指定要为该文件禁用的警告,而不是禁用全部警告。 要禁用全部警告,可以添加每个文件参数 -w 。源代码会发生变化,并且某些警告根据不同的构建设置适用或不适用。 Clang的消息可以告诉您哪个标志符等于生成的警告。
要使用Xcode更改文件的构建标志:
  • 选择目标
  • 选择构建阶段
  • 在“编译源”阶段中找到要修改参数的文件
  • 双击其“编译器标志”单元格进行编辑

25

在 Justin 的回答帮助下,以下是您需要执行的步骤:

1. 找到警告名称。

在我的情况下,它是 conversion

enter image description here

2. 在文件编译阶段中添加每个文件的编译器标志。

使用筛选器查找编译源中文件名的名称,输入 -Wno-[error name],例如:-Wno-conversion

enter image description here


哈利路亚!我为此四处搜寻了很久。-W选项的语法似乎没有任何文档记录! - mluisbrown

3
你可以选择特定目标->构建设置,搜索Inhibit All Warnings并将其设置为YES。这将禁用此目标上的警告。 如果您使用像cocoapods这样的代码工具,例如JSONKit,并且不想看到编译器对警告发出的哭声,那么这非常有用 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接