如何摆脱Xcode中的“未使用变量”警告?


98

我完全理解为什么会发生未使用的变量警告。我一般不想抑制它们,因为它们在大多数情况下都非常有用。但是,请考虑以下(伪造的)代码。

NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);

Xcode报告这saved是一个未使用的变量,当然不是。我怀疑这是因为NSAssert1是宏。该NS_BLOCK_ASSERTIONS没有定义,那么目标C断言肯定启用。

尽管它没有任何伤害,但我发现它不整洁和令人讨厌,并且我想抑制它,但是我不确定该怎么做。将变量分配给自身可以摆脱编译器警告,但是如果存在这种情况,我宁愿以“正确”的方式进行操作。

Answers:


107

我不确定新的LLVM编译器是否仍然支持它,但是GCC具有“未使用”属性,您可以使用它来抑制该警告:

BOOL saved __attribute__((unused)) = [moc save:&error];

或者,(如果LLVM不支持以上内容),您可以将变量声明分成单独的一行,以确保无论宏是否扩展,都将“使用”变量:

BOOL saved = NO;
saved = [moc save:&error];

107

使用Xcode 4.3.2,发现这似乎可行(更少的编写)

BOOL saved __unused;

这对我不起作用,我得到一个警告'saved' was marked as unused but was used
希思·博德斯

37

在Xcode中,您可以为“未使用的变量”设置警告。转到目标的“构建设置”,并使用单词“未使用”进行过滤

这是屏幕截图: Builld设置截图

我建议您仅将其更改为调试。这样一来,您就不会错过发行版中的任何内容。


37
您是否错过了格里高利所说的问题“我不想总体上压制它们,因为它们在大多数情况下都非常有用”的部分?
Sherm Pendley

8
@ShermPendley不管怎么说,它仍然有用,它回答了我关于如何全局关闭它的问题。
拉菲安2012年

9
关闭警告是错过错误的好方法。我强烈建议您反对。
Orion elenzil

2
@orionelenzil-好,是的,不是。存在一个带有误报的实际接口问题。如果您还没有进入使用变量的代码部分,那么在编写代码时,警告会不断弹出。随着时间的流逝,这将训练您忽略警告,这意味着您很可能会错过更重要的错误。最好能够抑制正在主动编辑的代码块中的错误。
TechZen 2014年

嗨,如果我设置为NO,它的工作正常。但我的疑问是:我必须设置Debug&Release NO ya仅未使用变量:NO?我必须设置哪一个。如果我设置“完全否”,那么它在发布期间不会创建任何概率吗?
SR纳亚克2014年

22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

尝试这样。它为我工作。它也将为您工作。


这对我不起作用,我收到一条警告'saved' was marked as unused but was used
希思·

15

标记变量为已用的唯一简单且可移植的方法是…使用它。

BOOL saved = ...;
(void)saved; // now used

不过,您可能会对已经描述的编译器特定扩展感到满意。


2
我比上面描述的丑陋的#pragma更喜欢它。
2014年

1
嗨,兄弟,不错的提示
dimazava

13
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

资源


这是最干净的方法,因为它只禁用了#pragmas
cornr


5

您可以在“发布”上设置“否” LLVM编译器2.0警告在此处输入图片说明


4

这是您在C语言(因此在Objective-C语言)中执行此操作的方式。

即使您没有启用警告,将返回值标记为显式忽略也是一个好主意。它也向其他开发人员表明,您不仅忘记了返回值,而且确实选择了忽略它。

(void)[moc save:&error];

编辑:编译器忽略对的强制转换void,因此它不应该影响性能-这只是一个很好的干净的人工注释。


在某些情况下,您必须使用此技巧来获取要编译的Objective-C代码。使用(void)是最清晰的方法,谢谢!
Dan Rosenstark '17

1

使它占用两行。声明和默认值分开

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
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.