有没有办法抑制Xcode中的警告?


119

有没有办法抑制Xcode中的警告?

例如,我正在调用一个未公开的方法,由于该方法不在头文件中,因此我会收到编译警告。我知道我可以将其添加到标题中以停止警告,但是我想知道是否有其他方法可以将其添加到标题中(这样我就可以使标题保持清洁和标准)来抑制警告?杂物之类的?


是的,有时你需要说的编译器不(根据他)发出警告,任何未使用的变量下降,但实际上你可能会使用它作为BOOL ok = [[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&d interval:NULL forDate:self]; NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);
thesummersign

Answers:


145

要基于文件禁用警告,使用Xcode 3和llvm-gcc-4.2可以使用:

#pragma GCC diagnostic ignored "-Wwarning-flag"

警告名称是一些gcc警告标志。

这将覆盖命令行上的所有警告标志。但是,它并不适用于所有警告。将-fdiagnostics-show-option添加到CFLAGS中,您将看到可以用来禁用该警告的标志。


谢谢 !正是我需要的!
Moszi 2011年

28
获取警告代码的简单方法:转到“日志浏览器”(Command + 7),选择最顶部的版本,展开日志(右侧的“ =”按钮),然后滚动到底部。
Neal Ehardt 2012年

1
对于那些关心的人,GCC警告选项的教育参考:gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Levi

2
似乎#pragma GCC diagnostic ignored "-Wwarning-flag"已被删除
allenlinli

1
@allenlinli仍然存在,您只需要替换warning-flaggcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Fonix

49

有一个更简单的方法来抑制未使用的变量警告:

#pragma unused(varname)

编辑:来源:http : //www.cocoadev.com/index.pl?XCodePragmas

更新:我遇到了一个新的解决方案,一个更强大的解决方案

  1. 打开项目>编辑活动目标>构建选项卡。
  2. User-Defined:查找(或创建一个,如果找不到的话)下,密钥:GCC_WARN_UNUSED_VARIABLE将其设置为NO

EDIT-2示例:

BOOL ok = YES;
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

编译器显示未使用的变量警告 ok

解:

BOOL ok = YES;
#pragma unused(ok)
NSAssert1(ok, @"Failed to calculate the first day the month based on %@", self);

PS:您还可以设置/重置其他警告 GCC_WARN_ABOUT_RETURN_TYPEYES/NO


31
更简单的方法是将__unused放在变量声明之前。
Mark Leonard

@ mark-leonard应该是一个单独的答案,我已经寻找了好几天了。我不得不无奈地开始阅读评论。谢谢。
养神

35

对于gcc,您可以使用

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow-ivar"
// your code
#pragma GCC diagnostic pop

您可以在此处了解GCC编译指示,并获取警告的警告代码,请转到“报表浏览器”(Command + 9),选择最顶层的版本,展开日志(右侧的“ =”按钮),然后滚动至底部,您的警告代码在这样的方括号内[-Wshadow-ivar]

对于c,您可以使用

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop

4
Clang支持GCC的编译指示以与现有源代码兼容。因此,您只需要编写gcc格式的编译指示即可。
艾伦

1
从Xcode 5.0开始,Clang是唯一提供的编译器。因此,您现在可以使用clang格式编译指示。
allenlinli

27

为了取消对单个文件的警告,请执行以下操作:

在xcode项目中选择文件。按获取信息,转到带有构建选项的页面,输入-Wno-取消警告:

-不会-

例如

-未使用参数

如果您查看项目设置,请查看构建选项卡页面底部的GCC警告,即可获得警告的名称,通过单击每个警告,它将告诉您警告参数名称:

例如

当函数参数除了声明外没有被使用时发出警告。[GCC_WARN_UNUSED_PARAMETER,-Wunused参数]


2
对于当您包含了不想修改的代码库中的代码而触发触发编译器警告时,这是一个极好的解决方案……
Mark Beaton

似乎是一个很好的方式,但任何想法,你如何在XCode中4做到这一点
Santthosh

2
发现我的解决方案这里的XCode 4 stackoverflow.com/questions/6057192/...
Santthosh

如果您只需要针对一个问题的紧急警告,例如我的:...m:45:69: Incompatible pointer types sending...我打开了构建说明并找到了这个警告:[-Wincompatible-pointer-types]我只是将其重命名为,-Wno-incompatible-pointer-types并作为标志添加到我的.m文件中...没有更多警告... + 10我可以
Nicos Karalis 2012年

5

使用Objective-C,许多严重错误只会显示为警告。我不仅从来没有禁用警告,我常打开“警告视为错误”(-Werror)。

可以通过正确执行操作(通常通过将对象转换为正确的类型)或在需要时声明原型来避免代码中的每种警告。


14
尽管这是很好的一般建议,但它不能回答问题。并非所有警告都是紧急或严重的。许多都是小事。假设由于某种原因(遗留代码库,要由第三方链接的代码,老板规定等)而要求使用第三方库并且不能对其进行修改,在这些情况下,禁止特定的琐碎警告是完全可以接受的。
Paul Legato

5

摆脱警告:尝试为有问题的对象创建类别界面

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

-(void) myMethod {
...
   [theObject theUndocumentedMethod];
...
}

顺便说一句,我强烈建议不要在运输代码中调用未记录的方法。接口可能会改变,这将是您的错。


我也这样做。我将类别称为“私人”,并将其放在.m文件的顶部...这是一种向前声明仅在文件内使用的方法的方法。我同意私有头文件会更标准,但是必须在文件之间不断反弹以获取真正应该完全包含(私有)到实现中的东西。
Pat Niemeyer,2010年

因此,事实证明,您可以使用仅在任何方法使用之前就实现该方法的C技巧。然后,您将获得一个文件本地方法。我认为它不是私有的,因此其他文件可能会向您以这种方式定义的选择器发送消息。
Mark Pauley


3

创建一个名为“ Undocumented.h”的新的单独头文件,并将其添加到您的项目中。然后为每个要在其上调用未记录函数的类创建一个接口块,并为每个类分配一个“(未记录)”类别。然后,只需在PCH中包含该头文件即可。这样,您的原始头文件将保持干净,仅保留一个其他文件,并且您可以在PCH中注释掉一行以再次启用所有警告。

我也将此方法用于类别为((Depreciated)'的'Depreciated.h'中已弃用的函数。

最好的部分是您可以通过注释或取消注释单个原型来有选择地启用/禁用单个警告。


1

禁止该特定警告是不安全的。编译器需要知道参数的类型,然后返回一种方法来生成正确的代码。

例如,如果您要调用这样的方法

[foo doSomethingWithFloat:1.0];

它需要一个浮点数,并且没有可见的原型,那么编译器将猜测该方法需要一个double数,而不是一个float数。这可能导致崩溃和错误解释的值。在上面的示例中,在像intel机器这样的小字节序机器上,接收器方法将看到0传递,而不是1传递。

您可以在i386 ABI文档中阅读原因,也可以修复警告。:-)


2
好的建议,但实际上并不能回答上述问题。
Paul Legato
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.