125

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

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

4

9 回答 9

147

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

#pragma GCC diagnostic ignored "-Wwarning-flag"

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

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

于 2008-10-13T05:28:52.843 回答
50

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

#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_TYPE::YES/NO

于 2011-11-03T09:13:44.813 回答
40

对于 gcc,您可以使用

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

您可以在此处了解GCC pragma并获取警告的警告代码,请转到 Report Navigator (Command+9),选择最顶层的构建,展开日志(右侧的“=”按钮),然后滚动到底部和那里你的警告代码在这样的方括号内[-Wshadow-ivar]

对于铿锵声,你可以使用

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop
于 2014-09-06T12:48:41.383 回答
27

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

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

-没有-

例如

-Wno-未使用的参数

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

例如

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

于 2010-10-19T01:05:48.910 回答
5

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

@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)

-(id)theUndocumentedMethod;
@end
...

@implementation myClass : mySuperclass

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

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

于 2009-09-26T00:10:13.327 回答
5

在 Objective-C 中,一些严重的错误只会以警告的形式出现。我不仅从不禁用警告,而且通常打开“将警告视为错误”(-Werror)。

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

于 2008-11-10T06:57:05.700 回答
5

http://nshipster.com/pragma/#inhibiting-warnings - 跳到禁止警告部分

于 2013-07-05T16:09:29.773 回答
3

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

我也将这种方法用于“Depreciated.h”中具有“(Depreciated)”类别的折旧函数。

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

于 2010-06-13T07:29:07.097 回答
1

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

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

[foo doSomethingWithFloat:1.0];

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

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

于 2008-10-15T07:07:44.233 回答