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

时间:2008-10-11 21:21:29

标签: objective-c xcode cocoa cocoa-touch suppress-warnings

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

例如,我正在调用一个未记录的方法,因为该方法不在标题中,所以我在编译时收到警告。我知道我可以将它添加到我的标题中以停止警告,但我想知道除了将其添加到标题之外是否有其他方法(所以我可以保持标题清洁和标准)来抑制警告?一个pragma或什么?

9 个答案:

答案 0 :(得分:140)

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

#pragma GCC diagnostic ignored "-Wwarning-flag"

警告名称是gcc警告标志。

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

答案 1 :(得分:48)

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

#pragma unused(varname)

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

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

  1. 打开项目>编辑有效目标>构建选项卡。
  2. User-Defined下:找到(或创建,如果找不到)关键:GCC_WARN_UNUSED_VARIABLE将其设置为NO
  3. 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

答案 2 :(得分:32)

对于gcc,您可以使用

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

您可以了解GCC pragma here并获取警告的警告代码转到报告导航器(Command + 9),选择最顶层的构建,展开日志(' =&#39 ;右侧的按钮),滚动到底部,警告代码在方括号内,如[-Wshadow-ivar]

对于clang,您可以使用

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

答案 3 :(得分:25)

为了压制单个文件的警告,请执行以下操作:

在xcode项目中选择文件。 按下获取信息 转到包含构建选项的页面 输入-Wno-来否定警告:

  

-Wno -

e.g。

  

-Wno非占线参数

如果您查看项目设置,可以查看位于构建标签页底部的GCC警告的警告名称,通过单击每个警告它将告诉您警告参数名称:

e.g。

  

每当函数参数发出警告时   除了声明之外没用过的。   [GCC_WARN_UNUSED_PARAMETER,   -Wunused参数]

答案 4 :(得分:5)

要消除警告:尝试为相关对象创建类别界面

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

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

顺便说一句,我强烈建议不要在发货代码中调用未记录的方法。界面可以而且会改变,这将是你的错。

答案 5 :(得分:4)

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

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

答案 6 :(得分:4)

答案 7 :(得分:3)

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

我还将此方法用于'Depreciated.h'中的折旧函数,其类别为'(Depreciated)'。

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

答案 8 :(得分:1)

抑制该特定警告并不安全。编译器需要知道参数的类型并返回到生成正确代码的方法。

例如,如果你正在调用这样的方法

[foo doSomethingWithFloat:1.0];

采用浮点数,并且没有可见的原型,然后编译器会猜测该方法需要一个double,而不是float。这可能会导致崩溃和错误解释的值。在上面的例子中,在像intel机器这样的小端机器上,接收器方法会看到0通过,而不是1。

您可以在i386 ABI docs中阅读原因,或者您可以修改警告。 : - )