100

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

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

Xcode 报告这saved是一个未使用的变量,当然它不是。我怀疑这是因为NSAssert1是宏。NS_BLOCK_ASSERTIONS未定义,因此肯定启用了 Objective C 断言。

虽然它不会伤害任何东西,但我觉得它不整洁和烦人,我想压制它,但我不知道该怎么做。将变量分配给自身可以消除编译器警告,但如果存在这种情况,我宁愿以“正确”的方式进行操作。

4

10 回答 10

110

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

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

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

BOOL saved = NO;
saved = [moc save:&error];
于 2011-03-27T18:06:14.167 回答
108

使用 Xcode 4.3.2 发现这似乎可行(少写)

BOOL saved __unused;
于 2012-05-14T06:40:47.700 回答
37

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

这是一个屏幕截图:构建设置屏幕截图

我建议您仅将其更改为 Debug。这样您就不会错过发布版本中的任何内容。

于 2011-03-27T19:35:29.480 回答
22
NSError *error = nil;
BOOL saved = [moc save:&error];
NSAssert1(saved, @"Dude!!1! %@!!!", error);
#pragma unused(saved)

像这样试试。它对我有用。它也对你有用。

于 2012-08-21T01:28:02.940 回答
16

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

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

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

于 2014-02-19T08:10:28.560 回答
15
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
    NSUInteger abc; /// Your unused variable
#pragma clang diagnostic pop

资源

于 2017-08-04T13:58:39.917 回答
8

尝试:__unused 属性。在 Xcode 5 中工作

于 2014-02-28T15:09:13.623 回答
6

这是您在 C 中执行此操作的方式,因此也是 Objective-C 中的方式。

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

(void)[moc save:&error];

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

于 2017-03-30T11:55:38.727 回答
5

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

于 2014-06-11T15:53:56.800 回答
1

让它占据两行。分离声明和默认值

BOOL enabled = NO;

// ...

BOOL enabled;

enabled = NO;
于 2016-06-22T20:38:00.510 回答