有没有办法抑制 Xcode 中的警告?
例如,我正在调用一个未记录的方法,并且由于该方法不在标头中,因此我在编译时收到警告。我知道我可以将它添加到我的标题以停止警告,但我想知道除了将它添加到标题(这样我可以保持标题清洁和标准)之外是否还有其他方法来抑制警告?一个pragma还是什么?
有没有办法抑制 Xcode 中的警告?
例如,我正在调用一个未记录的方法,并且由于该方法不在标头中,因此我在编译时收到警告。我知道我可以将它添加到我的标题以停止警告,但我想知道除了将它添加到标题(这样我可以保持标题清洁和标准)之外是否还有其他方法来抑制警告?一个pragma还是什么?
要在每个文件的基础上禁用警告,使用 Xcode 3 和 llvm-gcc-4.2,您可以使用:
#pragma GCC diagnostic ignored "-Wwarning-flag"
警告名称是一些 gcc 警告标志。
这会覆盖命令行上的任何警告标志。但它不适用于所有警告。将 -fdiagnostics-show-option 添加到您的 CFLAGS 中,您可以查看可以使用哪个标志来禁用该警告。
有一种更简单的方法可以抑制未使用的变量警告:
#pragma unused(varname)
编辑:来源:http ://www.cocoadev.com/index.pl?XCodePragmas
更新:我遇到了一个新的解决方案,一个更强大的解决方案
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
#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
为了抑制单个文件的警告,请执行以下操作:
在 xcode 项目中选择文件。按获取信息转到带有构建选项的页面输入 -Wno- 以否定警告:
-没有-
例如
-Wno-未使用的参数
如果您查看项目设置查看位于构建选项卡页面底部的 GCC 警告,您可以获得警告的名称,通过单击每个警告,它会告诉您警告参数名称:
例如
每当函数参数除了声明之外未使用时发出警告。[GCC_WARN_UNUSED_PARAMETER,-Wunused-参数]
摆脱警告:尝试为有问题的对象创建一个类别界面
@interface NSTheClass (MyUndocumentedMethodsForNSTheClass)
-(id)theUndocumentedMethod;
@end
...
@implementation myClass : mySuperclass
-(void) myMethod {
...
[theObject theUndocumentedMethod];
...
}
顺便说一句,我强烈建议不要在运输代码中调用未记录的方法。界面可以并且将会改变,这将是你的错。
在 Objective-C 中,一些严重的错误只会以警告的形式出现。我不仅从不禁用警告,而且通常打开“将警告视为错误”(-Werror)。
通过正确地做事(通常通过将对象转换为正确的类型)或在需要时声明原型,可以避免代码中的每种类型的警告。
创建一个名为“Undocumented.h”的新的单独头文件并将其添加到您的项目中。然后为每个要调用未记录函数的类创建一个接口块,并为每个类分配“(未记录)”类别。然后只需在您的 PCH 中包含那个头文件。这样,您的原始头文件保持干净,只需要维护一个其他文件,并且您可以注释掉 PCH 中的一行以重新启用所有警告。
我也将这种方法用于“Depreciated.h”中具有“(Depreciated)”类别的折旧函数。
最好的部分是您可以通过注释或取消注释单个原型来选择性地启用/禁用单个警告。
抑制该特定警告是不安全的。编译器需要知道参数的类型并返回一个方法来生成正确的代码。
例如,如果您正在调用这样的方法
[foo doSomethingWithFloat:1.0];
那需要一个浮点数,并且没有可见的原型,那么编译器会猜测该方法需要一个双精度,而不是一个浮点数。这可能会导致崩溃和错误解释的值。在上面的例子中,在像 intel 机器这样的小端机器上,接收器方法会看到 0 通过,而不是 1。
您可以在i386 ABI 文档中阅读原因,或者您可以修复您的警告。:-)